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

问题描述 投票:2回答:2

在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)。

我这样做的目的是使用比显示选择的完整文本所需的更少的显示空间(更少的宽度),因为我的一些项目字符串非常长并且当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。

qt qt5 qcombobox
2个回答
2
投票

对的,这是可能的。 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,尤其是角色。


Another solution is use translations with multiple lengths. You can provide couple translation for a single string. Each translation should be graphically shorter than earlier one.

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

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


-1
投票

在你的例子中,只需make:

qc->setWidth( 20 );

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

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

void changeComboText()
{
   QString shortText;
  //Determine short value for shortText
   qc->setCurrentText( shortText );
}
© www.soinside.com 2019 - 2024. All rights reserved.