pyqt 之 QTableView listvview 添加复选框 Checkbox
简述
使用各种View控件如QTableView、listview,经常会遇到复选框,要实现一个好的复选框,除了常规的功能外,还应注意以下几点:
- 三态:不选/半选/全选
- 自定义风格(样式)
常见的实现方式
-
编辑委托 方式:利用委托重载createEditor(),激活QCheckBox 特点:必须双击/选中,才能显示CheckBox控件。一般不满足实际中的直接显示的需要。 使用QTableView的setIndexWidget(const QModelIndex &index, QWidget *widget)来实现。 此功能用来显示可视区域内对应一个数据项的静态内容。如果想显示自定义的动态内容或执行自定义编辑器部件,子类化QItemDelegate代替。也就是说,这只适合做静态数据的显示,不适合做一些插入、更新、删除操作的数据显示。 自定义模型QAbstractTableModel,通过flags()函数来实现 方式:通过将flags()设置为Qt::ItemIsUserCheckable实现可选中,然后配合setData()与data()来实现。 特点:直接显示,可定义样式,默认左对齐,很难实现居中、右对齐 自定义委托QAbstractItemDelegate,通过paint()函数来实现。 方式:通过控制editorEvent()实现鼠标的点击进行全选/半选/不选,然后由paint()实时绘制。 特点:这种方式比较复杂,但适合扩展,除了可以嵌入复选框,还可以绘制其它控件-按钮、图片等。 QStandardltem
此处参考:
具体实现
1.自定义模型QAbstractTableModel,通过flags()函数来实现
2.自定义委托QAbstractItemDelegate,通过paint()函数来实现
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Delegate(QtWidgets.QStyledItemDelegate):
def editorEvent(self, event, model, option, index):
checked = index.data(QtCore.Qt.CheckStateRole)
ret = QtWidgets.QStyledItemDelegate.editorEvent(self, event, model, option, index)
if checked != index.data(QtCore.Qt.CheckStateRole):
self.parent().checked.emit(index)
return ret
class ListView(QtWidgets.QListView):
checked = QtCore.pyqtSignal(QtCore.QModelIndex)
def __init__(self, *args, **kwargs):
super(ListView, self).__init__(*args, **kwargs)
self.setItemDelegate(Delegate(self))
class AppRemovalPage(QtWidgets.QWizardPage):
def __init__( self, parent=None):
super(AppRemovalPage, self).__init__(parent)
self.setTitle(Apps to Remove)
self.setSubTitle(Listview)
self.list_view = ListView(self)
self.list_view.setMinimumSize(465, 200)
self.model = QtGui.QStandardItemModel(self)
for line in (a, b, c, d, e):
self.item = QtGui.QStandardItem(line)
self.item.setCheckable(True)
self.item.setCheckState(QtCore.Qt.Unchecked)
self.model.appendRow(self.item)
self.list_view.setModel(self.model)
self.list_view.checked.connect(self.onChecked)
@QtCore.pyqtSlot(QtCore.QModelIndex)
def onChecked(self, index):
item = self.model.itemFromIndex(index)
if item.checkState() == QtCore.Qt.Checked:
print(item.text(), "was checked")
else:
print(item.text(), "was unchecked")
if __name__ == __main__:
app = QtWidgets.QApplication(sys.argv)
listview = AppRemovalPage()
listview.show()
sys.exit(app.exec_())
3. QStandardltem 实现
-
注意事项 如果是多行多列的数据存储,对应视图如果没有使用tableView和treeView,而用的是listView,则数据只会展示第一列的数据
下一篇:
python爬虫学习-定制请求头
