【问题标题】:Can a QComboBox display a different value than whats in it's list?QComboBox 可以显示与其列表中的内容不同的值吗?
【发布时间】:2017-12-22 04:31:26
【问题描述】:

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

【问题讨论】:

  • 你能告诉我这个吗?我正在尝试这种方法,使用的值仍然是我作为 DisplayRole 放置的值。
  • @ArchitJ,看看这个:stackoverflow.com/q/63323959/5366641

标签: qt qt5 qcombobox


【解决方案1】:

是的,这是可能的。 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 包含由空间字符分隔的所有可能性。当呈现此类字符串时,将使用适合可用空间的第一个子字符串(分隔符之间)。

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

【讨论】:

  • 提示:QComboBox 已经有默认的QStandardItemModel。所以可以使用auto model = qobject_cast<QStandardItemModel*>( qc->model() );
  • 减去拼写错误,我已将其放入,但在将 UserRole 值显示为选定值时存在问题。除了 DisplayRole ["Green"] 是选定值并且下拉列表也是 DisplayRole ["Green"] 值之外,这一切都有效。只是在正常非下拉状态下看不到 UserRole 值作为选定值。
  • 仍然有这个问题。将不胜感激任何人可能有的任何想法。无法让用户角色以正常(非下拉)状态显示。
  • @Ender,你为什么接受这个答案?它对你有用吗?
  • 为什么会被接受和支持?充其量,这是朝着正确方向迈出的不完整的一步。您如何使文本区域使用一个角色,而下拉菜单使用另一个角色?链接的文档没有提到如何做到这一点。
【解决方案2】:

在你的例子中,让它简短一点:

qc->setWidth( 20 );

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

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

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

【讨论】:

  • 太丑了。该解决方案将强制发出大量不必要的信号。特别是文本更改信号。而且它不适用于可编辑的组合框。
  • 在之前使用 qc->blockSignals(true),之后使用 "false"。在那种情况下。
  • 最好的解决方案是制作没有文字的彩色项目。但这会复杂得多。
  • blockSignals 真的吗?另一个拐杖。有颜色的物品很容易用模特的角色制作。
猜你喜欢
  • 1970-01-01
  • 2020-11-29
  • 2023-03-15
  • 1970-01-01
  • 2017-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
相关资源
最近更新 更多