Qt -设置不可编辑的QComboBox的显示文本

Qt - Set display text of non-editable QComboBox

本文关键字:QComboBox 显示 文本 编辑 设置 Qt      更新时间:2023-10-16

我想将QComboBox的文本设置为一些自定义文本(不在QComboBox的列表中),而不将此文本添加为QComboBox的项。这种行为可以在带有QComboBox::setEditText(const QString & text)的可编辑QComboBox上实现。但是,在不可编辑的QComboBox上,此函数不执行任何操作。

是否可以通过编程方式将不可编辑的QComboBox的显示/编辑文本设置为不在其列表中的内容?或者我必须找到另一种方式(例如使用带有弹出式菜单的QPushButton)

编辑:考虑一个带有InsertPolicy QComboBox::NoInsert的可编辑QComboBox。如果用户键入某些内容并按enter键,则将使用输入的值,但不会添加到列表中。我想要的是这种行为以编程方式改变"当前"文本,但不允许用户自己输入一些文本。用户可以从QComboBox中选择一些内容,但过了一段时间,我可能想要覆盖'current'文本。

当我子类化QComboBox以使复选框的组合框时,我遇到了同样的问题。我编写了一个小函数以编程方式更改组合框中显示的文本,但是我不想让用户能够编辑该文本。解决方案是将组合框设置为可编辑的:

 this->setEditable(true);

QComboBox::lineEdit()设置为只读。参考函数:

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

重新实现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);
}
...

我假设你想有一个组合框,"a","B","C"作为实际数据和"这是a","这是B"answers"这是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"

注意:您几乎可以为组合框Item设置所需的所有数据类型。更重要的是,您可以使用setItemData的第三个参数为每个项目设置不止一个附加数据。

我最终使用了一个带有弹出菜单的QPushButton。我将QComboBox列表中的项目作为QActions添加到菜单中。菜单可以用

QPushButton上设置
QPushButton::setMenu(QMenu* menu)

。按钮上的文字可以很容易地用

设置。
QPushButton::setText(const QString &)

与弹出式菜单中的文本无关,这正是我想要的。