Qt — Установить отображаемый текст нередактируемого QComboBox

Я хотел бы установить для текста QComboBox некоторый пользовательский текст (которого нет в списке QComboBox), не добавляя этот текст в качестве элемента QComboBox.
Такое поведение достижимо на редактируемом QComboBox с QComboBox::setEditText(const QString & text),
Однако на нередактируемом QComboBox эта функция ничего не делает.

Можно ли программно настроить отображение / редактирование текста нередактируемого QComboBox на то, чего нет в его списке?
Или я должен найти другой способ (например, использовать QPushButton с всплывающим меню)

РЕДАКТИРОВАТЬ: рассмотрим редактируемый QComboBox с InsertPolicy QComboBox::NoInsert, Если пользователь вводит что-то и нажимает ввод, введенное значение будет использовано, но не добавлено в список. Я хочу, чтобы это поведение программно изменяло «текущий» текст, но не позволяло пользователю самому вводить какой-либо текст. Пользователь может выбрать что-то из QComboBox, но через некоторое время я могу переопределить «текущий» текст.

3

Решение

У меня была такая же проблема, когда я подкласс QComboBox сделать поле со списком флажков. Я написал небольшую функцию для программного изменения текста, отображаемого в поле со списком, но я не хотел, чтобы пользователь мог редактировать этот текст. Решением было установить поле со списком как редактируемое:

 this->setEditable(true);

и QComboBox::lineEdit() только для чтения. Обратитесь к функции:

void CheckedComboBox::setText(QString text)
{
QLineEdit *displayedText = this->lineEdit();
displayedText->setText(text);
displayedText->setReadOnly(true);
}
2

Другие решения

Я предположил, что вы хотите иметь поле со списком «A», «B», «C» в качестве фактических данных и «Это A», «Это B» и «Это c», как то, что отображается в QComboBox. Вот код:

box.addItems(QStringList () << "This is A"<< "This is B"<< "This is C");
box.setItemData(0, "A");
box.setItemData(1, "B");
box.setItemData(2, "C");

Вы можете получить фактические данные с помощью этого кода:

QString actual = box.itemData(0).toString();//actual will be = "A";
qDebug()<<actual;//"A"

Примечание. Вы можете практически установить все типы данных для элемента со списком. Более того, вы можете установить более одной дополнительной информации для каждого элемента с помощью третьего параметра setItemData.

1

Переопределение краскиEvent: https://github.com/qt/qtbase/blob/28d1d19a526148845107b631612520a3524b402b/src/widgets/widgets/qcombobox.cpp#L2995

и добавьте эту строку: opt.currentText = QString(tr("My Custom Text"));

Пример :

QCustomCheckComboBoxFilter.h

...
protected:
void paintEvent(QPaintEvent *e) Q_DECL_OVERRIDE;
...

QCustomCheckComboBoxFilter.cpp

...
void QCustomCheckComboBoxFilter::paintEvent(QPaintEvent *)
{
QStylePainter painter(this);
painter.setPen(palette().color(QPalette::Text));

// draw the combobox frame, focusrect and selected etc.
QStyleOptionComboBox opt;
initStyleOption(&opt);
opt.currentText = QString(tr("My Custom Text"));
painter.drawComplexControl(QStyle::CC_ComboBox, opt);

// draw the icon and text
painter.drawControl(QStyle::CE_ComboBoxLabel, opt);
}
...
1

Я в конечном итоге с помощью QPushButton с всплывающим меню.
Я добавил вещи, которые у меня были в списке моих QComboBox как QActions в меню.
Меню может быть установлено на QPushButton с

QPushButton::setMenu(QMenu* menu)

.
Текст на кнопке может быть легко установлен с помощью

QPushButton::setText(const QString &)

и не имеет отношения к тексту во всплывающем меню, что я и хотел.

0
По вопросам рекламы [email protected]