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

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

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

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


person PrisonMonkeys    schedule 18.04.2013    source источник
comment
чего вы пытаетесь достичь, что-то вроде всплывающей подсказки? Я думаю, что в редактируемом поле со списком он добавляет некоторые непредсказуемые параметры, но если он не редактируется, почему бы не добавить этот текст всплывающей подсказки в качестве элемента с нулевым индексом, например, и после него добавить элементы, которые необходимы   -  person Shf    schedule 18.04.2013


Ответы (4)


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

 this->setEditable(true);

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

void CheckedComboBox::setText(QString text)
{
   QLineEdit *displayedText = this->lineEdit();
   displayedText->setText(text);
   displayedText->setReadOnly(true);
}
person Jays    schedule 01.10.2014
comment
Спасибо, это работает. Жаль, что пользовательский интерфейс сильно изменился из-за setEditable (по крайней мере, на Mac он меняется). - person PrisonMonkeys; 17.02.2015

Переопределите paintEvent: 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);
}
...
person Sebastien247    schedule 31.08.2017

Я предположил, что вы хотите иметь поле со списком с «A», «B», «C» в качестве фактических данных и «This is A», «This is B» и «This is 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.

person s4eed    schedule 18.04.2013
comment
Это не совсем то, чего я хочу. Я хочу QComboBox с 3 параметрами (A, B, C), и отображаемый текст может быть либо одним из этих трех параметров, либо чем-то еще (ничего из списка). Это не должно быть четвертым вариантом в списке. И я хочу неоднократно менять фактический текст этого чего-то другого. - person PrisonMonkeys; 18.04.2013

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

QPushButton::setMenu(QMenu* menu)

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

QPushButton::setText(const QString &)

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

person PrisonMonkeys    schedule 19.04.2013