Qt之模型/视图(委托)
					
											标签:
																				
                            qtqt委托qlistview委托qtableview委托qtreeview委托 | 
					分类: Qt | 
概念
使用现有委托
一个简单的委托
class SpinBoxDelegate : public QStyledItemDelegate
{
    Q_OBJECT  
public:
(QObject *parent = 0); SpinBoxDelegate 
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,
    const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model,
    const QModelIndex &index) const;
    void updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
提供了一个编辑器
    在这个例子中,当表视图需要提供一个编辑器时,它将要求委托提供一个编辑器部件适用于修改该项目。createEditor()函数提供一切,委托需要能够建立一个合适的窗口小部件:
QWidget *SpinBoxDelegate::createEditor(QWidget *parent,
QStyleOptionViewItem &, const 
QModelIndex &) const const 
{
*editor = new QSpinBox(parent); QSpinBox 
editor->setFrame(false); 
editor->setMinimum(0); 
editor->setMaximum(100); 
return editor; }
    注意,我们不需要一个指向编辑器的部件,因为当不再需要时,视图负责销毁它。
在编辑器上安装代理的默认事件过滤器,以确保它提供了用户所期望的标准编辑快捷方式。编辑器中可以添加额外的快捷键,以允许更复杂的行为。 
可以根据视图提供的模型索引创建不同的编辑器。例如,如果有一个整数列和字符串列,我们可以返回一个QSpinBox或QLineEdit,这取决于哪一列正在被编辑。 
委托必须提供一个函数将模型中的数据复制到编辑器中。在这个例子中,我们读出存储在显示角色中的数据,并在QSpinBox中设置的值相应。 
void SpinBoxDelegate::setEditorData(QWidget *editor,
QModelIndex &index) const const 
{
int value = index.model()->data(index, Qt::EditRole).toInt(); 
QSpinBox *spinBox = static_cast<<span style=" color:#800080;">QSpinBox*>(editor); 
spinBox->setValue(value); 
}
在这个例子中,我们知道编辑器部件是一个QSpinBox,但可以为模型中不同类型的数据提供不同的编辑器,在这种情况下,则需要在访问它的成员函数之前设置部件为适当的类型。 
void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const 
{
*spinBox = static_cast<<span style=" color:#800080;">QSpinBox*>(editor); QSpinBox 
spinBox->interpretText(); 
int value = spinBox->value(); 
model->setData(index, value, Qt::EditRole); 
}
由于视图为委托管理编辑器部件,所以只需要以编辑器提供的内容来更新模型。在这种情况下,我们确QSpinBox是最新更新,并使用指定的索引包含的值来更新模型。 
标准的QItemDelegate类通过发射closeEditor()信号来完成编辑视图。视图可确保编辑器部件被关闭和销毁。在这个例子中,我们只提供简单的编辑功能,所以我们需要永远不会发出这个信号。 
所有的数据操作通过QAbstractItemModel提供的接口执行。这使得委托大多独立于它操纵的数据的类型,但为了使用某些类型的编辑器部件,则必须做出一些假设。在这个例子中,我们假设模型总是包含整数值,但我们仍然在不同类型的模型中使用此委托,因为的QVariant为意想不到的数据提供了合理的默认值。 
更新编辑器的几何形状
管理编辑器的几何形状是委托的责任。当编辑器被创建,或者当项目视图的的位置、大小在视图中改变时,几何形状必须被设置。幸运的是,视图提供了视图选项物体内部所有必要的几何信息。 
void SpinBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &) const 
{
editor->setGeometry(option.rect); 
}
这种情况下,我们仅在项目区域中使用视图选项提供的位置信息。使用一些元素展现项目的委托不会直接使用该项目矩形。根据这个项目中的其他元素来设定编辑器的位置。 
int main(int argc, char *argv[])
{
QApplication app(argc, argv); 
QStandardItemModel model(4, 2); 
QTableView tableView; 
tableView.setModel(&model); 
delegate; SpinBoxDelegate 
tableView.setItemDelegate(&delegate); 
tableView.horizontalHeader()->setStretchLastSection(true); 
for (int row = 0; row <<span style=" color:#c0c0c0;"> 4; ++row) { 
for (int column = 0; column <<span style=" color:#c0c0c0;"> 2; ++column) { 
QModelIndex index = model.index(row, column, QModelIndex()); 
model.setData(index, QVariant((row + 1) * (column + 1))); 
} 
} 
tableView.setWindowTitle(QObject::tr("Spin Box Delegate")); 
tableView.show(); 
return app.exec(); 
}
注:
前一篇:Qt之模型/视图
										后一篇:Qt之模型/视图(实时更新数据)
					
加载中…