Qt中的QComBobox,个性化项目

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

在Qt中,我想为QComBox中的每个项添加一个短项字符串。这意味着当我在QComBox中选择一个项目时,我想显示相应的短项目字符串而不是所选的项目字符串。

例如,对于QComBox。我添加了项目“aaa”,“bbb”和“aaa”我设置了一个名为“a”的短字符串,也为“bbb”设置了“b”当我选择“aaa”时,我希望显示“a”在现场而不是“aaa”。

而且我想要的项目不像标准QComBox那样可编辑,我的意思是外观应该与不可编辑的QComBox相同。如何在Qt中实现此行为,在此先感谢。

qt qcombobox
3个回答
2
投票

我们的想法是为组合框的下拉菜单设置自定义项目deledate,以便它使用其他数据来显示。 “a”和“b”将成为主要项目文本,“aaa”和“bbb”将被分配给Qt::UserRole。工作范例:

class MyItemDelegate : public QStyledItemDelegate {
  Q_OBJECT
public:
  MyItemDelegate() {
    fake_model.setColumnCount(1);
    fake_model.setRowCount(1);
    fake_model.setItem(0, 0, new QStandardItem());
  }

  void paint(QPainter *painter, const QStyleOptionViewItem &option, 
             const QModelIndex &index) const {
    fake_model.item(0, 0)->setText(index.data(Qt::UserRole).toString());
    QStyledItemDelegate::paint(painter, option, fake_model.index(0, 0));
  }

private:
  QStandardItemModel fake_model;
};

//...
ui->comboBox->addItem("a", "aaa");
ui->comboBox->addItem("b", "bbb");
ui->comboBox->setItemDelegate(new MyItemDelegate());

如果你想用UserRole获取其他东西,你可以切换到另一个角色:使用ui->comboBox->setItemData(0, "aaa", otherRole)来设置数据并改变paint方法实现中的角色。


1
投票

你不需要像Pavel Strakhov所建议的那样操纵代码。只有当您想要对已查看项目进行非常具体的自定义时,才需要代表。在你的情况下,它足以操纵QComboBox的数据模型:

// Adding item:
void addItem( QComboBox *cb, const QString& name, const QString& userData )
{
  QStandardItemModel *model = qobject_cast< QStandardItemModel * >( cb->model() );
  QStandardItem *newItem = new QStandardItem();
  newItem->setData( name, Qt::DisplayRole );
  newItem->setData( userData , Qt::UserRole );
  model->appendRow( newItem );
}

// Getting item data
void getItemData( QComboBox *cb, const int index, QString& name, QString& userData )
{
  QStandardItemModel *model = qobject_cast< QStandardItemModel * >( cb->model() );
  QStandardItem *item = model->item( index );
  name = item ->data( name, Qt::DisplayRole ).toString();
  userData = item ->data( Qt::UserRole ).toString();
}

在那里使用Qt MVC是一种好习惯。您将拥有许多额外功能,例如禁用项目,添加复选框,更改字体等。

您需要为我的示例添加数据验证(检查指针/索引)。我只是想表现出主意。


0
投票

您可以从QComboBox派生自己的组合框类并覆盖这些函数,以便打开自定义菜单进行选择。在此自定义菜单中,您可以为项目使用与ComboBox本身不同的名称。所以QCombobox会保存项目“a”,“b”等,而在菜单中你创建条目“aaa”,“bbb”。将“a”连接到“aaa”的逻辑是你的工作,但这很简单。您只需使用项目的索引即可。

以下是一个例子,其中出于不同的原因实现了这个想法:http://svn.gerbilvis.org/wsvn/Gerbil/gui/widgets/ahcombobox.h http://svn.gerbilvis.org/wsvn/Gerbil/gui/widgets/ahcombobox.cpp

组合框的行为与经典组合略有不同,但可用性是相同的。在某些情况下,QComboBox使用这样的菜单来显示,在其他情况下,它会执行下拉列表。使用这种方法,它只是一个菜单。

© www.soinside.com 2019 - 2024. All rights reserved.