通过QAbstractTableModel制作复选框(Make checkbox by QAbstractTableModel)

编程入门 行业动态 更新时间:2024-10-17 21:18:58
通过QAbstractTableModel制作复选框(Make checkbox by QAbstractTableModel)

我想用复选框创建第一列,并获取它的检查状态,我该怎么做? 我重写了flag(),但似乎不起作用,我确定问题出在哪里?

我得到了这个链接 ,但它也适用于我的代码。 而且我不想使用委托,因为它太复杂了。

data = [['00','01','02'], ['10','11','12'], ['20','21','22']] class MainWindow(QWidget): def __init__(self, parent=None, *args): super(MainWindow, self).__init__(parent) clipTableWidget = QTableWidget() self.model = TModel(data, self) clipTableView = QTableView() clipTableView.setModel(self.model) layout = QVBoxLayout() layout.addWidget(clipTableView) self.setLayout(layout) class TModel(QAbstractTableModel): def __init__(self, datain, parent=None): super(TModel, self).__init__(parent) self.arraydata = datain def rowCount(self, parent=QModelIndex()): return len(self.arraydata) def columnCount(self, parent=QModelIndex()): return len(self.arraydata[0]) def data(self, index, role): if not index.isValid(): return QVariant() elif role != Qt.DisplayRole: return QVariant() return QVariant(self.arraydata[index.row()][index.column()]) def flags(self, index): if not index.isValid(): return QVariant() elif index.column() == 1: return Qt.ItemIsSelectable|Qt.ItemIsEnabled|Qt.ItemIsUserCheckable return QVariant()

I want to make the first column with checkbox, and get the check status of that, how can I do that? I override the flag(), but it seems do not work, I am sure where is the problem?

And I got this links, but it does work for my code either. And I don't want to use delegate, because it is too complicated.

data = [['00','01','02'], ['10','11','12'], ['20','21','22']] class MainWindow(QWidget): def __init__(self, parent=None, *args): super(MainWindow, self).__init__(parent) clipTableWidget = QTableWidget() self.model = TModel(data, self) clipTableView = QTableView() clipTableView.setModel(self.model) layout = QVBoxLayout() layout.addWidget(clipTableView) self.setLayout(layout) class TModel(QAbstractTableModel): def __init__(self, datain, parent=None): super(TModel, self).__init__(parent) self.arraydata = datain def rowCount(self, parent=QModelIndex()): return len(self.arraydata) def columnCount(self, parent=QModelIndex()): return len(self.arraydata[0]) def data(self, index, role): if not index.isValid(): return QVariant() elif role != Qt.DisplayRole: return QVariant() return QVariant(self.arraydata[index.row()][index.column()]) def flags(self, index): if not index.isValid(): return QVariant() elif index.column() == 1: return Qt.ItemIsSelectable|Qt.ItemIsEnabled|Qt.ItemIsUserCheckable return QVariant()

最满意答案

好的,这是您的问题的解决方案。 你的标志不起作用的原因是因为那些标志不适用于文本,它们适用于QItems。

from PyQt4.QtCore import * from PyQt4.QtGui import * import sys class MainWindow(QWidget): def __init__(self, parent=None, *args): super(MainWindow, self).__init__(parent) data = [['00','01','02'], ['10','11','12'], ['20','21','22']] clipTableWidget = QTableWidget() self.model = QStandardItemModel(self) clipTableView = QTableView() count1=0 for row in data: count2 = 0 for column in row: if count2 == 0: item = QStandardItem(column) item.setCheckable(True) item.setCheckState(False) item.setFlags(Qt.ItemIsUserCheckable| Qt.ItemIsEnabled) self.model.setItem(count1,count2,item) count2+=1 else: item = QStandardItem(column) self.model.setItem(count1,count2,item) count2+=1 count1+=1 clipTableView.setModel(self.model) layout = QVBoxLayout() layout.addWidget(clipTableView) self.setLayout(layout) def main(): app = QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_()) if __name__ == "__main__": main()

Ok here is the solution to your problem. The reason Why your flags weren't working is because those flags dont work on text , they are meant for QItems .

from PyQt4.QtCore import * from PyQt4.QtGui import * import sys class MainWindow(QWidget): def __init__(self, parent=None, *args): super(MainWindow, self).__init__(parent) data = [['00','01','02'], ['10','11','12'], ['20','21','22']] clipTableWidget = QTableWidget() self.model = QStandardItemModel(self) clipTableView = QTableView() count1=0 for row in data: count2 = 0 for column in row: if count2 == 0: item = QStandardItem(column) item.setCheckable(True) item.setCheckState(False) item.setFlags(Qt.ItemIsUserCheckable| Qt.ItemIsEnabled) self.model.setItem(count1,count2,item) count2+=1 else: item = QStandardItem(column) self.model.setItem(count1,count2,item) count2+=1 count1+=1 clipTableView.setModel(self.model) layout = QVBoxLayout() layout.addWidget(clipTableView) self.setLayout(layout) def main(): app = QApplication(sys.argv) w = MainWindow() w.show() sys.exit(app.exec_()) if __name__ == "__main__": main()

更多推荐

本文发布于:2023-07-04 17:06:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1026946.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:复选框   QAbstractTableModel   checkbox

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!