2015-09-11 67 views
1

在我的QTableView中,我想要複選框的第一列,但我得到填充了複選框的所有行列,並且所有這些列都默認選中。我無法改變複選框的狀態。如何獲取QTableView的第一列中的複選框pyqt

class MyTableModel(QtCore.QAbstractTableModel): 
    def __init__(self, listData=[[]], headers=[], parent=None): 
     super(MyTableModel, self).__init__(parent) 

     self.__listData = listData 
     self.__headers = headers 


    def data(self, index, role): 
     row = index.row() 
     column = index.column() 
     value = self.__listData[row][column] 

     if role == QtCore.Qt.CheckStateRole: 
      if self.__listData[row] == 0: 
       return QtCore.QVariant(QtCore.Qt.Unchecked) 
      else: 
       return QtCore.QVariant(QtCore.Qt.Checked) 
     if role == QtCore.Qt.EditRole: 
      return value 
     if role == QtCore.Qt.DisplayRole: 
      return value 
+0

您是否考慮過使用'QStandardItemModel'(由'QStandardItem's填充)而不是創建自己的模型?它免費提供了很多這種行爲,除非您有特定需要創建自定義模型,否則建議您這樣做。 –

+0

好吧,我還沒有直接跳到這個階段,我有一個特定的需求,所以對於有複選框選中的行可以保持並且不選中什麼得到清除或不被處理。 –

+0

我得到複選框的要求。如果您要使用它,我在說已經在'QStandardItemModel'中實現了這個功能。我的問題是,你是否需要不在'QStandardItemModel'中的功能?如果你這樣做,那麼詳細說明它們並將它們包含在你的代碼片段中可能是一個好主意,這樣它們可以被合併到問題的答案中。如果你不這樣做,那麼我建議切換到'QStandardItemModel' –

回答

0

現在不要談論PyQT,但認爲與C++ Qt沒有什麼區別。 您需要覆蓋Qt::ItemFlags QAbstractItemModel::flags(const QModelIndex & index) const並返回您的可選列Qt::ItemIsUserCheckable

0

剛剛遇到了這個問題。不知道你找到答案。 要回答您的問題,如果您只希望複選框僅用於第一列,則僅需要QtCore.Qt.UncheckedQtCore.Qt.Checkedcolumn == 0index。所以,你可以改變你的代碼:

def data(self, index, role): 
    row = index.row() 
    column = index.column() 
    value = self.__listData[row][column] 

    if role == QtCore.Qt.CheckStateRole and column == 0: 
     if self.__listData[row] == 0: 
      return QtCore.QVariant(QtCore.Qt.Unchecked) 
     else: 
      return QtCore.QVariant(QtCore.Qt.Checked) 
    if role == QtCore.Qt.EditRole: 
     return value 
    if role == QtCore.Qt.DisplayRole: 
     return value 

而且,您可以檢查indexself.__listData並返回QtCore.Qt.UncheckedQtCore.Qt.Checked相應。

相關問題