我想将QComboBox的文本设置为一些自定义文本(不在QComboBox的列表中),而不将此文本添加为QComboBox的项目。
在具有QComboBox::setEditText(const QString & text)
的可编辑QComboBox上可以实现此行为。
但是,在不可编辑的QComboBox上,此函数不执行任何操作。
是否可以以编程方式将不可编辑的QComboBox的显示/编辑文本设置为不在其列表中的内容? 或者我必须找到另一种方式(例如,使用带弹出菜单的QPushButton)
编辑:考虑使用InsertPolicy
QComboBox::NoInsert
的可编辑QComboBox。如果用户输入某些内容并按下输入,则将使用输入的值但不会将其添加到列表中。我想要的是这种改变现状的行为。文本编程,但不允许用户自己键入一些文本。用户可以从QComboBox中选择一些东西,但是过了一段时间,我可能想要覆盖“当前的”#39;文本。
答案 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 &)
与弹出菜单中的文字无关,这就是我想要的。