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

时间:2013-04-18 10:25:49

标签: c++ qt qcombobox

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

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

编辑:考虑使用InsertPolicy QComboBox::NoInsert的可编辑QComboBox。如果用户输入某些内容并按下输入,则将使用输入的值但不会将其添加到列表中。我想要的是这种改变现状的行为。文本编程,但不允许用户自己键入一些文本。用户可以从QComboBox中选择一些东西,但是过了一段时间,我可能想要覆盖“当前的”#39;文本。

4 个答案:

答案 0 :(得分:2)

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

 this->setEditable(true);

QComboBox::lineEdit()只读。请参阅功能:

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

答案 1 :(得分:1)

我想你想要一个组合框,其中“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为每个项目设置更多的附加数据。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我最后使用带有弹出菜单的QPushButton。 我将QComboBox列表中的项目QActions添加到菜单中。 可以使用

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

。 可以使用

轻松设置按钮上的文本
QPushButton::setText(const QString &)

与弹出菜单中的文字无关,这就是我想要的。