免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4648 | 回复: 2

如何通过QAbstractTableModel实现checkbox复选框 [复制链接]

论坛徽章:
0
发表于 2014-01-26 22:25 |显示全部楼层
本帖最后由 liaozd 于 2014-01-26 22:33 编辑

我想通过flag的方式实现第一列数据有checkbox,我尝试了一下,但是不明白是哪里出错了。

我还想做的是,得到那些被复选框选中的坐标
  1. from PyQt4.QtCore import *
  2. from PyQt4.QtGui import *
  3. import sys

  4. data = [['00','01','02'],
  5.          ['10','11','12'],
  6.          ['20','21','22']]

  7. class MainWindow(QWidget):
  8.     def __init__(self, parent=None, *args):
  9.         super(MainWindow, self).__init__(parent)
  10.         
  11.         clipTableWidget = QTableWidget()
  12.         self.model = TModel(data, self)
  13.         clipTableView = QTableView()
  14.         clipTableView.setModel(self.model)
  15.         layout = QVBoxLayout()
  16.         layout.addWidget(clipTableView)
  17.         self.setLayout(layout)

  18.                
  19. class TModel(QAbstractTableModel):

  20.     def __init__(self, datain, parent=None):
  21.         super(TModel, self).__init__(parent)
  22.         self.arraydata = datain

  23.     def rowCount(self, parent=QModelIndex()):
  24.         return len(self.arraydata)

  25.     def columnCount(self, parent=QModelIndex()):
  26.         return len(self.arraydata[0])

  27.     def data(self, index, role):
  28.         if not index.isValid():
  29.             return QVariant()
  30.         elif role != Qt.DisplayRole:
  31.             return QVariant()
  32.         return QVariant(self.arraydata[index.row()][index.column()])
  33.    
  34.      # 以下是我的尝试,我不知道哪里错了,第一列无法显示出有复选框   
  35.     def flags(self, index):
  36.         if not index.isValid():
  37.             return QVariant()
  38.         elif index.column() == 1:
  39.             return Qt.ItemIsSelectable|Qt.ItemIsEnabled|Qt.ItemIsUserCheckable
  40.         return QVariant()
  41.    


  42. if __name__ == '__main__':
  43.    
  44.     app = QApplication(sys.argv)
  45.     mainwindow = MainWindow()
  46.     mainwindow.show()
  47.     sys.exit(app.exec_())
复制代码

论坛徽章:
0
发表于 2014-01-26 23:08 |显示全部楼层
帮顶                           

论坛徽章:
0
发表于 2014-01-27 14:34 |显示全部楼层
回复 1# liaozd

网上找了一下,但是还是不是很明确原理,和如何得到哪些row是checked的?
  1. from PyQt4.QtCore import *
  2. from PyQt4.QtGui import *
  3. import sys

  4. my_array = [['00','01','02'],
  5.             ['10','11','12'],
  6.             ['20','21','22']]

  7. def main():
  8.     app = QApplication(sys.argv)
  9.     w = MyWindow()
  10.     w.show()
  11.     sys.exit(app.exec_())

  12. class MyWindow(QWidget):
  13.     def __init__(self, *args):
  14.         QWidget.__init__(self, *args)
  15.         tablemodel = MyTableModel(my_array, self)
  16.         tableview = QTableView()
  17.         tableview.setModel(tablemodel)
  18.         layout = QVBoxLayout(self)
  19.         layout.addWidget(tableview)
  20.         self.setLayout(layout)

  21. class MyTableModel(QAbstractTableModel):
  22.     def __init__(self, datain, parent=None, *args):
  23.         QAbstractTableModel.__init__(self, parent, *args)
  24.         self.arraydata = datain
  25.         self._checked=[False for i in  xrange(self.rowCount(self))]
  26.         print self._checked

  27.     def rowCount(self, parent):
  28.         return len(self.arraydata)

  29.     def columnCount(self, parent):
  30.         return len(self.arraydata[0])

  31.     def flags(self, index):
  32.         if not index.isValid():
  33.             return
  34.         elif index.column() == 0:
  35.             return Qt.ItemIsEnabled|Qt.ItemIsUserCheckable
  36.         return Qt.ItemIsSelectable|Qt.ItemIsEditable|Qt.ItemIsEnabled

  37.     def data(self, index, role):

  38.         if not index.isValid():
  39.             return QVariant()
  40.         elif role == Qt.DisplayRole:
  41.             return QVariant(self.arraydata[index.row()][index.column()])
  42.         elif index.column() == 0 and role==Qt.CheckStateRole:
  43.             return self._checked[index.row()]
  44.         return None # what this for? I am not sure.

  45.     def setData(self, index, value, role):
  46.         if not index.isValid() or role!=Qt.CheckStateRole:
  47.             return False
  48.         elif index.column()==0:
  49.             self._checked[index.row()]=value
  50.             self.dataChanged.emit(index, index)
  51.             print self._checked
  52.         return True

  53. if __name__ == "__main__":
  54.     main()
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

DTCC2020中国数据库技术大会

【架构革新 高效可控】2020年12月21日-23日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


大会官网>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP