2014-01-26 32 views
1

我想使複選框的第一列,並獲得檢查狀態,我該怎麼做?我重寫了flag(),但它似乎不起作用,我確定問題在哪裏?使複選框由QAbstractTableModel

我得到了這個links,但它確實對我的代碼也有效。我不想使用委託,因爲它太複雜了。

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() 
+0

這裏的問題是,你沒有使用項來存儲你的數據,因爲該標誌說它是一個Qt.ItemIsUserCheckable。它需要一個項目來實現這個特性。 – TheCreator232

回答

0

好的,這裏是你的問題的解決方案。爲什麼你的標誌不工作的原因是因爲這些標誌不工作的文本,他們是爲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()