(Qt)使组合框代表作为选项显示模型的整个列

Posted

技术标签:

【中文标题】(Qt)使组合框代表作为选项显示模型的整个列【英文标题】:(Qt) Making a combobox delegate show as options a whole column of a model 【发布时间】:2014-09-08 12:24:21 【问题描述】:

好吧,这个问题可能是因为我对代表的工作了解不足。

使用模型/视图框架。到目前为止,我已经制作了几个派生委托,但我现在需要的是获得一个选择选项委托(例如组合框),以将保存在我选择的 QTableModel 列上的数据显示为选项。我无法做到这一点,因为(我认为)在重新实现时,函数的参数不包含整个模型,而只包含 QTableModel 的项目。

我不知道如何用模型列的数据填充委托的编辑器。我认为由于编程的安全问题而无法做到这一点,我试图从代表那里发送一个信号来询问模型,但代表似乎无法发出信号。

谁能指导我如何做到这一点?

我查看了一个带有自定义选项示例的组合框委托,但该示例没有从模型中读取选项,选项作为常量加载。

【问题讨论】:

【参考方案1】:

1.如果你创建了一个派生自QStyledItemDelegateQAbstractItemDelegate 的新类,你可以创建一个新的constructor 并传递一个指向模型的指针或任何你想要的东西。

2.您也可以使用QModelIndex 的方法从模型中获取任何数据。例如:index.data() 将返回要显示的数据,index.data(Qt::UserRole) 将返回您在模型的 data 方法中实现的任何内容。示例:

 virtual QVariant MyMode::data (const QModelIndex & index, int role) const
 
    if (role == Qt::UserRole)
      return m_options;
    ...
 

 QWidget *StyledItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem & option, const QModelIndex & index) const
 
     Options options = index.data(Qt::UserRole).value<Options>()
     ...
 

【讨论】:

1.所以在我的主小部件的构造函数上创建类 MyCustomDelegate 之后应该出现:model = new QSqlTablemodel;视图 = 新 QTableModel; MyCustomDelegate *mydelegate = new MyCustomDelegate(model);视图->setdelegateforcolumn(mydelegate,column); . . 2.您是说我可以创建一个UserRole,以便数据能够返回我的项目数据,设置项目的整个列的数据?谢谢你的回答! @user2348235 1 - 是的。 2 - 是的。 UserRole 返回的内容取决于您。在我的示例中,它会返回一些与列无关的选项。您可以添加支票if (role == Qt::UserRole and index.column() == 0switch(index.column()) case 0: return settingsA; case 1: return settingsB;...【参考方案2】:

可悲的是,经过大量编码并且在使课程正常运行后遇到了麻烦。我发现有一个小部件在您选择的模型上搜索匹配项时已经自动完成。该类称为 QCompleter...

【讨论】:

以上是关于(Qt)使组合框代表作为选项显示模型的整个列的主要内容,如果未能解决你的问题,请参考以下文章

Qt c++ 依赖组合框和依赖标签

更改组合框选项以修改图形/图表

更改组合框选项以修改图形/图表

在现有主窗口上显示在 PyQt GUI 上选择组合框选项的图表

根据组合框中的是/否值逐行更新表格列

组合框单元格值数据源datagridview