QComboBox 可以显示与其列表中不同的值吗?

Can a QComboBox display a different value than whats in it's list?

在 Linux 上使用 Qt 5.9,我有一个带有多个标签的 QComboBox。

qc = new QComboBox;
qc->addItem(tr("Red"));
qc->addItem(tr("Green"));
qc->addItem(tr("Blue"));

假设用户激活了 QComboBox,下拉列表中显示了 3 个颜色标签。然后用户选择第一项(红色)。

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

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

编辑:
使用 Marek 的示例,认为这可能会有所帮助。这就是我所拥有的。我希望如果用户从列表中选择,那么后面应该显示 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 );

但是如果你真的想让用户选择一些东西,那么:

connect( qc, SIGNAL( onCurrentIndexChanged( int ) ), SLOT( changeComboText() ) ); [...]

void changeComboText()
{
   QString shortText;
  //Determine short value for shortText
   qc->setCurrentText( shortText );
}

是的,这是可能的。 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);

应该可以,但我没有测试。至少这应该是一些线索。

请查看 QComboBox documentation,尤其是角色。


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

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

现在我不记得分隔符的值是多少了。我很久以前就用过这个(Qt 4.8),现在找不到它的参考资料了。