装修公司网站源码php,河北廊坊建筑模板厂家,网页设计素材网站有哪些,郑州大搜索网站描述
QSqlRelationalDelegate类提供了一个委托#xff0c;用于显示和编辑来自QSqlRelationalTableModel的数据。
与默认委托不同#xff0c;QSqlRelationalDelegate为作为其他表的外键的字段提供了一个组合框。 要使用该类#xff0c;只需在带有QSqlRelationalDelegate实例…描述
QSqlRelationalDelegate类提供了一个委托用于显示和编辑来自QSqlRelationalTableModel的数据。
与默认委托不同QSqlRelationalDelegate为作为其他表的外键的字段提供了一个组合框。 要使用该类只需在带有QSqlRelationalDelegate实例的视图上调用QAbstractItemView::setItemDelegate(); Ex: QSqlRelationalTableModel* pModel new QSqlRelationalTableModel();pModel-setTable(person);pModel-setRelation(2, QSqlRelation(items, id, itemtype));ui-tableView-setModel(pModel);ui-tableView-setItemDelegate(new QSqlRelationalDelegate());pModel-select();关系表模型示例(如下所示)演示了如何将QSqlRelationalDelegate与QSqlRelationalTableModel结合使用为表提供外键支持。
重写
有两个重写方法:
QWidget *QSqlRelationalDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem option, const QModelIndex index) constvoid QSqlRelationalDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex index) const
createEditor
QWidget *createEditor(QWidget *aParent,const QStyleOptionViewItem option,const QModelIndex index) const
{const QSqlRelationalTableModel *sqlModel qobject_castconst QSqlRelationalTableModel *(index.model());QSqlTableModel *childModel sqlModel ? sqlModel-relationModel(index.column()) : 0;if (!childModel)return QItemDelegate::createEditor(aParent, option, index);QComboBox *combo new QComboBox(aParent);combo-setModel(childModel);combo-setModelColumn(childModel-fieldIndex(sqlModel-relation(index.column()).displayColumn()));combo-installEventFilter(const_castQSqlRelationalDelegate *(this));return combo;
}上述代码实现了自定义委托的createEditor函数用于创建一个QComboBox作为单元格的编辑器通过index.model()获取主数据模型并将其qobject_cast转换为QSqlRelationalTableModel类型如果成功转换则说明该数据模型具有关联模型使用sqlModel-relationModel(index.column())获取与该列关联的子数据模型。如果该列没有关联模型它将返回0这意味着将使用默认的委托QItemDelegate来创建单元格编辑器。
如果存在关联模型则创建一个QComboBox并将其设置为该列的单元格编辑器。
子模型是通过combo-setModel(childModel)设置的其中childModel是通过sqlModel-relationModel(index.column())获取的使用sqlModel-relation(index.column()).displayColumn()获取子模型中用于显示选择项的列并将其设置为QComboBox的模型列即combo-setModelColumn为ComboBox安装一个事件过滤器使得在编辑完成后能够正确更新主数据模型最后返回ComboBox作为单元格编辑器。
setModelData
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex index) const
{if (!index.isValid())return;QSqlRelationalTableModel *sqlModel qobject_castQSqlRelationalTableModel *(model);QSqlTableModel *childModel sqlModel ? sqlModel-relationModel(index.column()) : 0;QComboBox *combo qobject_castQComboBox *(editor);if (!sqlModel || !childModel || !combo) {QItemDelegate::setModelData(editor, model, index);return;}int currentItem combo-currentIndex();int childColIndex childModel-fieldIndex(sqlModel-relation(index.column()).displayColumn());int childEditIndex childModel-fieldIndex(sqlModel-relation(index.column()).indexColumn());sqlModel-setData(index,childModel-data(childModel-index(currentItem, childColIndex), Qt::DisplayRole),Qt::DisplayRole);sqlModel-setData(index,childModel-data(childModel-index(currentItem, childEditIndex), Qt::EditRole),Qt::EditRole);
}上述代码实现了自定义委托的setModelData函数用于将编辑器中的数据更新到主数据模型中首先检查index是否有效如果无效则直接返回通过qobject_cast将数据模型转换为QSqlRelationalTableModel类型并使用index.column()获取正在编辑的列的索引通过sqlModel-relationModel(index.column())获取与该列关联的子数据模型如果该列没有关联模型则将其设置为0通过qobject_cast将编辑器转换为QComboBox类型并检查它们是否存在。如果不存在则说明该列没有关联子模型或者使用默认委托编辑器就调用默认委托的setModelData函数来更新数据模型然后返回。
如果存在关联子模型和ComboBox编辑器它就使用combo-currentIndex()获取当前ComboBox选中项的索引使用sqlModel-setData将选中项的值设置到主数据模型的index位置。这里使用了两次sqlModel-setData分别将选中项的“显示值”和“编辑值”设置到主数据模型中其中“显示值”是通过sqlModel-relation(index.column()).displayColumn()获取的子模型中的列数据而“编辑值”是通过sqlModel-relation(index.column()).indexColumn()获取的子模型中指定的列数据
最后完成了所有数据更新操作
注意
如果需要下拉框功能就直接用就行。 先进行自定义信号发送则需要子类化操作。
结论
记住你是最好的如果有人比你好那就假装没看见他们。