您的位置:首页 > 编程语言 > Qt开发

关于QStyledItemDelegate在tableview控件中的使用心得

2016-11-01 13:17 399 查看
    Qt中的委托由Delegate类来实现,Delegate类在Qt中的继承框架如下





   图中可以看出QAbstractItemDelegate主要被两个类继承:QItemDelegate和QStyleItemDelegate。他们的区别是是否沿袭了用户提供的Qt style sheets。如果是使用了Qt style
sheets,选择QStyleItemDelegate类较好。

    使用Delegate类时必须重载的一些函数:

(1)QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;
(2)void setEditorData(QWidget *editor, const QModelIndex &index) const;
(3)void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const;
(4)void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;
其中
    (1)创建自定义widget并返回之,例如combobox,textedit等。

    (2)是将model中当前有的数据设置到代理上。自己从model取出数据,自己setValue到editor上。

    (3)是将editor上的数据保存到Model中。

    (4)就是将editor设置到一定位置,并且有一定大小,使这个editor看起来像是正好嵌入到格子里面一样。用的是option.rect。


    下面实现一个在QTableview中插入QComboBox控件的小例子。
    main函数:

#include "delegate.h"
#include <QApplication>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QTableView>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QStandardItemModel model(4, 2);
QTableView tableView;
tableView.setModel(&model);

ComboBoxDelegate delegate;
 tableView.setItemDelegateForColumn(1,&delegate);
tableView.horizontalHeader()->setStretchLastSection(true);
model.setHorizontalHeaderLabels(QStringList() << "名字"<< "成绩");
model.setData(model.index(0, 0, QModelIndex()),QVariant("张三"));
model.setData(model.index(1, 0, QModelIndex()),QVariant("赵四"));
model.setData(model.index(2, 0, QModelIndex()),QVariant("李五"));
model.setData(model.index(3, 0, QModelIndex()),QVariant("王六"));
model.setData(model.index(0, 1, QModelIndex()),QVariant("B"));
model.setData(model.index(1, 1, QModelIndex()),QVariant("C"));
model.setData(model.index(2, 1, QModelIndex()),QVariant("A"));
model.setData(model.index(3, 1, QModelIndex()),QVariant("B"));

tableView.setWindowTitle(QObject::tr("演示程序"));
tableView.show();
return app.exec();
}


delegate函数


#include "delegate.h"
#include <QComboBox>
#include <QMessageBox>

ComboBoxDelegate::ComboBoxDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{

}
QWidget *ComboBoxDelegate::createEditor(QWidget *parent,
const QStyleOptionViewItem &/* option */,
const QModelIndex &/* index */) const
{
QComboBox *editor = new QComboBox(parent);
editor->insertItem(0, "A");
editor->insertItem(1, "B");
editor->insertItem(2, "C");
editor->insertItem(3, "D");
editor->insertItem(4, "E");
return editor;
// QMessageBox::information(NULL, "提示", "0");
}

void ComboBoxDelegate::setEditorData(QWidget *editor,
const QModelIndex &index) const
{
QString value = index.model()->data(index, Qt::EditRole).toString();
QComboBox *ComboBox = static_cast<QComboBox*>(editor);
ComboBox->setCurrentText(value);
//QMessageBox::information(NULL, "提示", "1");
}

void ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
const QModelIndex &index) const
{
QComboBox *ComboBox = static_cast<QComboBox*>(editor);
QString value = ComboBox->currentText();
model->setData(index, value, Qt::EditRole);
// QMessageBox::information(NULL, "提示", "2");
}

void ComboBoxDelegate::updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
editor->setGeometry(option.rect);
//QMessageBox::information(NULL, "提示", "3");
}
 

对于委托原理不是很清楚的同学,可以将每个函数下面的QMessageBox函数去注释,看一看程序到底是怎么执行的便可一目了然了。

程序运行结果






    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Qt实践总结