Я хотел бы установить для текста QComboBox некоторый пользовательский текст (которого нет в списке QComboBox), не добавляя этот текст в качестве элемента QComboBox.
Такое поведение достижимо на редактируемом QComboBox с QComboBox::setEditText(const QString & text)
,
Однако на нередактируемом QComboBox эта функция ничего не делает.
Можно ли программно настроить отображение / редактирование текста нередактируемого QComboBox на то, чего нет в его списке?
Или я должен найти другой способ (например, использовать QPushButton с всплывающим меню)
РЕДАКТИРОВАТЬ: рассмотрим редактируемый QComboBox с InsertPolicy
QComboBox::NoInsert
, Если пользователь вводит что-то и нажимает ввод, введенное значение будет использовано, но не добавлено в список. Я хочу, чтобы это поведение программно изменяло «текущий» текст, но не позволяло пользователю самому вводить какой-либо текст. Пользователь может выбрать что-то из QComboBox, но через некоторое время я могу переопределить «текущий» текст.
У меня была такая же проблема, когда я подкласс QComboBox
сделать поле со списком флажков. Я написал небольшую функцию для программного изменения текста, отображаемого в поле со списком, но я не хотел, чтобы пользователь мог редактировать этот текст. Решением было установить поле со списком как редактируемое:
this->setEditable(true);
и QComboBox::lineEdit()
только для чтения. Обратитесь к функции:
void CheckedComboBox::setText(QString text)
{
QLineEdit *displayedText = this->lineEdit();
displayedText->setText(text);
displayedText->setReadOnly(true);
}
Я предположил, что вы хотите иметь поле со списком «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.
Переопределение краски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);
}
...
Я в конечном итоге с помощью QPushButton
с всплывающим меню.
Я добавил вещи, которые у меня были в списке моих QComboBox
как QActions
в меню.
Меню может быть установлено на QPushButton
с
QPushButton::setMenu(QMenu* menu)
.
Текст на кнопке может быть легко установлен с помощью
QPushButton::setText(const QString &)
и не имеет отношения к тексту во всплывающем меню, что я и хотел.