(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.如果你创建了一个派生自QStyledItemDelegate
或QAbstractItemDelegate
的新类,你可以创建一个新的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() == 0
或switch(index.column()) case 0: return settingsA; case 1: return settingsB;...
。【参考方案2】:
可悲的是,经过大量编码并且在使课程正常运行后遇到了麻烦。我发现有一个小部件在您选择的模型上搜索匹配项时已经自动完成。该类称为 QCompleter...
【讨论】:
以上是关于(Qt)使组合框代表作为选项显示模型的整个列的主要内容,如果未能解决你的问题,请参考以下文章