Qt QComboBox是否可以显示与其中的值不同的值';谁的名单?

Qt QComboBox是否可以显示与其中的值不同的值';谁的名单?,qt,qt5,qcombobox,Qt,Qt5,Qcombobox,在Linux上使用Qt5.9,我有一个带有几个标签的QComboBox qc = new QComboBox; qc->addItem(tr("Red")); qc->addItem(tr("Green")); qc->addItem(tr("Blue")); 假设用户激活QComboBox,3个颜色标签显示在下拉列表中。然后用户选择第一项(红色) 我想做的是让QComboBox显示与所选内容不同的值。也就是说,如果选择红色,则显示一个数字,第一个项目可能显示1(或红色可能是

在Linux上使用Qt5.9,我有一个带有几个标签的QComboBox

qc = new QComboBox;
qc->addItem(tr("Red"));
qc->addItem(tr("Green"));
qc->addItem(tr("Blue"));
假设用户激活QComboBox,3个颜色标签显示在下拉列表中。然后用户选择第一项(红色)

我想做的是让QComboBox显示与所选内容不同的值。也就是说,如果选择红色,则显示一个数字,第一个项目可能显示1(或红色可能是R),如果选择绿色,则第二个项目显示2(或G)

我这样做的目的是使用比显示选择的完整文本实际需要的更少的显示空间(宽度更小),因为我的一些项目字符串很长,并且当QComboBox在其下拉状态下未激活时,需要更短的标签。此外,项目字符串是描述性的,缩写更适合显示

编辑:
以马雷克为例,他认为这可能会有所帮助。这是我的。我希望,如果用户从列表中选择,则在之后应该显示R、G或B

QStandardItem *red = new QStandardItem();
red->setData(tr("Red"), Qt::DisplayRole);
red->setData("R", Qt::UserRole);

QStandardItem *green = new QStandardItem();
green->setData(tr("Green"), Qt::DisplayRole);
green->setData("G", Qt::UserRole);

QStandardItem *blue = new QStandardItem();
blue->setData(tr("Blue"), Qt::DisplayRole);
blue->setData("B", Qt::UserRole);

QStandardItemModel *rgb_model = new QStandardItemModel(this);
rgb_model->setItem(0, red);
rgb_model->setItem(1, green);
rgb_model->setItem(2, blue);

QComboBox *rgb_cb = new QComboBox();
rgb_cb->setModel(rgb_model);

我觉得这是因为我不太明白如何使用Qt::UserRole。

在您的示例中,简短地说就是:

qc->setWidth( 20 );
但如果你真的想让用户选择一些东西,那么:

连接(qc,信号(onCurrentIndexChanged(int)),插槽(changeComboText()); [……]


是的,这是可能的<代码>QComboBox使用数据模型管理项目。 您必须提供自己的数据模型,以及具有各自数据值的项

QStandardItem *itme1 = new QStandardItem();
item1->setData(tr("Red"), Qt::DisplayRole);
item1->setData("1", Qt::UserRole); // note doesn't have to be a string.

QStandardItem *itme2 = new QStandardItem();
item2->setData(tr("Green"), Qt::DisplayRole);
item2->setData("2", Qt::UserRole);

QStandardItemModel *model = new QStandardItemModel(this);
mode->setItem(1, item1);
mode->setItem(2, item2);

qc->setModel(model);
它应该可以工作,但我没有测试它。至少这应该是一些线索

请复习,特别是关于角色


另一个解决方案是使用具有多个长度的翻译。您可以为单个字符串提供成对翻译。每一个翻译都应该比之前的翻译短

在这种情况下,
QString
包含由空间字符分隔的所有可能性。当呈现这样的字符串时,将使用适合可用空间的第一个子字符串(分隔符之间)


现在我不记得分隔符的值是什么了。我很久以前就用过这个(Qt4.8),现在找不到它的参考。

提示:
QComboBox
alreay有默认值
QStandardItemModel
。因此可以使用
automodel=qobject\u cast(qc->model())减去输入错误,我已经输入了,但是UserRole值显示为所选值有问题。除了DisplayRole[“绿色”]是所选值,下拉列表也是DisplayRole[“绿色”]值之外,所有这些都可以正常工作。只是在正常的非下拉状态下没有将UserRole值视为所选值。仍然存在此问题。我很感激任何人的想法。无法让用户角色以正常(非下拉)状态显示。@Ender,你为什么接受这个答案?这对你有用吗?为什么这被接受和投票?这充其量只是朝着正确方向迈出的不完整的一步。如何使文本区域使用一个角色,而下拉列表使用另一个角色?链接的文档没有提到如何做到这一点。太难看了。此解决方案将强制发出大量不必要的信号。特别是文字变化信号。它不适用于可编辑的组合框。只需在前面使用qc->blockSignals(true),后面使用“false”。在这种情况下,最好的解决方案是制作没有文字的彩色项目。但这将更加复杂。
块信号
真的吗?另一根拐杖。彩色物品很容易用模特角色制作。你能告诉我这方面的最新情况吗?我正在尝试这种方法,使用的值仍然是我作为DisplayRole输入的值。@ArchitJ,检查一下:
QStandardItem *itme1 = new QStandardItem();
item1->setData(tr("Red"), Qt::DisplayRole);
item1->setData("1", Qt::UserRole); // note doesn't have to be a string.

QStandardItem *itme2 = new QStandardItem();
item2->setData(tr("Green"), Qt::DisplayRole);
item2->setData("2", Qt::UserRole);

QStandardItemModel *model = new QStandardItemModel(this);
mode->setItem(1, item1);
mode->setItem(2, item2);

qc->setModel(model);