python QQTableView中嵌入复选框CheckBox四种方法
2017-05-31 10:17 _天枢 阅读(2215) 评论(0) 编辑 收藏 举报搜索了一下,QTableView中嵌入复选框CheckBox方法有四种:
第一种不能之前显示,必须双击/选中后才能显示,不适用。
第二种比较简单,通常用这种方法。
第三种只适合静态显示静态数据用
第四种比较适合扩展,它除了可以嵌入复选框,还可以通过paint()绘制其它控件,图片等自定义风格。
第一种方法是:编辑委托法
这种方法直接利用委托中重载createEditor(),激活QCheckBox,这个缺点是必须双击/选中,才能显示CheckBox控件。一般不满足我们实际中的直接显示的需要。可以参考Qt中的QSpinBoxDelegate例子。
第二种方法是:设置QAbstractTableModel的flags()函数法。
- 2.在StudentInfoModel .h头文件中的主要代码:
- class StudentInfoModel : public QAbstractTableModel
- {
- Q_OBJECT
- public:
- StudentInfoModel(const int totalColumn, const int aColumnNumWithChechBox = 0, QObject *parent = 0)
- :totalColumn(totalColumn),colNumberWithCheckBox(aColumnNumWithChechBox),
- QAbstractTableModel(parent) {rowCheckStateMap.clear();};
- public:
- int rowCount(const QModelIndex &parent = QModelIndex()) const;
- int columnCount(const QModelIndex &parent = QModelIndex()) const;
- QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
- QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
- Qt::ItemFlags flags(const QModelIndex &index) const;
- bool setData(const QModelIndex &index, const QVariant &value, int role);
- public:
- void AddStudentInfo(const StudentInfo &studentInfo);
- signals:
- void StudentInfoIsChecked(const StudentInfo &studentInfo);
- private:
- typedef QVector<StudentInfo> StudentInfos;
- StudentInfos studentInfos;
- int totalColumn;
- int colNumberWithCheckBox;
- QMap<int, Qt::CheckState> rowCheckStateMap;
- };
- 3.在StudentInfoModel.cpp文件中的主要代码如下:
- QVariant StudentInfoModel::data( const QModelIndex &index, int role ) const
- {
- if (role == Qt::DisplayRole)
- {
- if (index.column() == 0)
- return QString::number(index.row()+1);
- if (index.column() == 1)
- return studentInfos[index.row()].stuNumber;
- if (index.column() == 2)
- return studentInfos[index.row()].stuName;
- if (index.column() == 3)
- return studentInfos[index.row()].stuID;
- if (index.column() == 4)
- return studentInfos[index.row()].stuPhoneNumber;
- if (index.column() == 5)
- return studentInfos[index.row()].department;
- if (index.column() == 6)
- return studentInfos[index.row()].stuDescription;
- }
- if (role == Qt::CheckStateRole)
- {
- if (index.column() == colNumberWithCheckBox)
- {
- if (rowCheckStateMap.contains(index.row()))
- return rowCheckStateMap[index.row()] == Qt::Checked ? Qt::Checked : Qt::Unchecked; return Qt::Unchecked;
- }
- }
- return QVariant();
- }
- Qt::ItemFlags StudentInfoModel::flags( const QModelIndex &index ) const
- {
- if
- (!index.isValid())
- return 0;
- if (index.column() == colNumberWithCheckBox)
- return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
- return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
- }
- bool StudentInfoModel::setData( const QModelIndex &index, const QVariant &value, int role )
- {
- if(!index.isValid())
- return false;
- if (role == Qt::CheckStateRole && index.column() == colNumberWithCheckBox)
- {
- if (value == Qt::Checked) //
- {
- rowCheckStateMap[index.row()] = Qt::Checked;
- if(studentInfos.size() > index.row())
- emit StudentInfoIsChecked(studentInfos[index.row()]);
- }
- else
- {
- rowCheckStateMap[index.row()] = Qt::Unchecked;
- }
- }
- return true;
- }
第三种方法是:用QTableView中的方法void setIndexWidget(const QModelIndex &index, QWidget *widget)来设置QCheckBox。
代码:setIndexWidget(index, new QTextEdit);
Qt Assistant 写道关于setIndexWidget()
If index is invalid (e.g., if you pass the root index), this function will do nothing.
The given widget's autoFillBackground property must be set to true, otherwise the widget's background will be transparent, showing both the model data and the item at the given index.
If index widget A is replaced with index widget B, index widget A will be deleted. For example, in the code snippet below, the QLineEdit object will be deleted.
setIndexWidget(index, new QLineEdit);
...
setIndexWidget(index, new QTextEdit);
This function should only be used to display static content within the visible area corresponding to an item of data. If you want to display custom dynamic content or implement a custom editor widget, subclass QItemDelegate instead.
此功能只应该用来显示可视区域内对应一个数据项的静态内容。如果你想显示自定义的动态内容或执行自定义编辑器部件,子类化QItemDelegate代替。
就是说这个只适合用来做不变数据的显示,而不适合做一些会产生插入,更新,删除这样的操作的数据显示.
作 者:
天枢
出 处:
http://www.cnblogs.com/yhleng/
关于作者:专注于软件自动化测试领域。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者
直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角
【
推荐】
一下。您的鼓励是作者坚持原创和持续写作的最大动力!