2011-03-21 57 views
1

我嘗試創建一個帶複選框的樹形視圖,但我無法選中複選框。無法選擇樹形視圖內的複選框

上我曾提到它作爲ItemisuserCheckable但仍無法得到它的工作方法的標誌

...

我失去了一些東西在這裏,以使複選框的選擇。

的代碼片段是:

import sys 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class StbTreeView(QAbstractListModel): 
    def __init__(self, args, parent=None): 
     super(StbTreeView, self).__init__(parent) 

     self.args = args 
     print self.args 

    def rowCount(self, parent): 
     return len(self.args) 

    def headerData(self, section, orientation, role): 
     if role == Qt.DisplayRole: 
      if orientation == Qt.Horizontal: 
       return QString("Select STB's") 

    def flags(self, index): 
     row = index.row() 
     if row: 
      return Qt.ItemIsUserCheckable | Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable 

    def data(self, index, role=Qt.DisplayRole): 

     if role == Qt.DisplayRole: 
      row = index.row() 
      return self.args[row] 

     if role == Qt.CheckStateRole: 

      row = index.row() 
      return QVariant(Qt.Unchecked) 

    def setData(self, index, value, role): 

     if role == Qt.CheckStateRole: 
      if value == Qt.Checked: 
       row = index.row() 
       selected_stb = self.args[row] 
       print 'selected_stb is %s' % selected_stb 
       print 'Value is %s' % value 
       self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"),index, index) 
       return True 
      #return QVariant(Qt.Checked) 

def main(): 
    myapp = QApplication(sys.argv) 

    data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8'] 

    model = StbTreeView(data) 
    tree_view = QTreeView() 
    tree_view.show() 
    tree_view.setModel(model) 

    myapp.exec_() 

if __name__ == '__main__': 
    main() 

回答

3

你需要掛在什麼地方當前項目狀態(選中\未選中),並改變它一旦setData()方法被調用。您的項目總是未選中,因爲您始終在data()方法中爲它們返回QVariant(Qt.Unchecked)

我改了一下你的代碼,看看它會爲你工作:

import sys 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class TestItem(): 
    def __init__(self, name, checked): 
     self.checked = checked 
     self.name = name 

class StbTreeView(QAbstractListModel): 
    def __init__(self, args, parent=None): 
     super(StbTreeView, self).__init__(parent) 

     self.args = [] 
     for item_name in args: 
      self.args.append(TestItem(item_name, False)) 

     for item in self.args: 
      print item.name 

    def rowCount(self, parent): 
     return len(self.args) 

    def headerData(self, section, orientation, role): 
     if role == Qt.DisplayRole: 
      if orientation == Qt.Horizontal: 
       return QString("Select STB's") 

    def flags(self, index): 
     return Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsEnabled 

    def data(self, index, role=Qt.DisplayRole): 
     if role == Qt.DisplayRole: 
      row = index.row() 
      print self.args[row].name 
      return self.args[row].name 

     if role == Qt.CheckStateRole: 
      row = index.row() 
      print self.args[row].checked 
      if self.args[row].checked == False: 
       return QVariant(Qt.Unchecked) 
      else: 
       return QVariant(Qt.Checked) 

    def setData(self, index, value, role): 
     if role == Qt.CheckStateRole: 
      row = index.row() 
      self.args[row].checked = not self.args[row].checked    
     return True 

def main(): 
    myapp = QApplication(sys.argv) 

    data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8'] 

    model = StbTreeView(data) 
    tree_view = QTreeView() 
    tree_view.show() 
    tree_view.setModel(model) 

    myapp.exec_() 

if __name__ == '__main__': 
    main() 

希望這會有所幫助,至於

+0

Thnaks它的工作完美的我......但我想用拉組合框這個樹形視圖代碼如下所述..但我無法使其工作..只是想知道我在這裏做錯了什麼。 – user596922 2011-04-03 16:42:13

0

由於它確實爲我工作。我原來的要求是在組合框上調用這個視圖/模型。我試圖調用它,但它沒有工作......我能夠看到組合框內的視圖,但無法選擇任何複選框。我嘗試了很多可能性,但沒有成功。

對代碼進行了輕微修改以從組合框中調用。

修改後的代碼是:

import sys 

from PyQt4.QtCore import * 
from PyQt4.QtGui import * 

class TestItem(): 
    def __init__(self, name, checked): 
     self.checked = checked 
     self.name = name 

class StbTreeView(QAbstractListModel): 
    def __init__(self, args, parent = None): 
     super(StbTreeView, self).__init__(parent) 

     self.args = [] 
     for item_name in args: 
      self.args.append(TestItem(item_name, False)) 

     for item in self.args: 
      print item.name 

    #print 'Value of self.args is %s' % self.args 

    def rowCount(self, parent): 
     return len(self.args) 

    def headerData(self, section, orientation, role): 
     if role == Qt.DisplayRole: 
      if orientation == Qt.Horizontal: 
       return QString("Select STB's") 

    def flags(self, index): 
     return Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsSelectable | Qt.ItemIsEnabled 

    def data(self, index, role=Qt.DisplayRole): 
     if role == Qt.DisplayRole: 
      row = index.row() 
      print self.args[row].name 
      return self.args[row].name 

     if role == Qt.CheckStateRole: 
      row = index.row() 
      print self.args[row].checked 
      if self.args[row].checked == False: 
       return QVariant(Qt.Unchecked) 
      else: 
       return QVariant(Qt.Checked) 

    def setData(self, index, value, role): 
     if role == Qt.CheckStateRole: 
      row = index.row() 
      self.args[row].checked = not self.args[row].checked    
     return True 

class Template(QTreeView): 
    def __init__(self, parent=None): 
     super(Template, self).__init__(parent) 

     self.data = ['STB1', 'STB2', 'STB3', 'STB4', 'STB5', 'STB6', 'STB7', 'STB8'] 
     self.MainUI() 

    def MainUI(self): 
     self.model = StbTreeView(self.data) 
     self.setModel(self.model) 


def main(): 
    myapp = QApplication(sys.argv) 
    temp = Template() 
    temp.show() 
    myapp.exec_() 

if __name__ == '__main__': 
    main() 

從組合框代碼:

stb_listview = QComboBox() 
view = Template() 
stb_listview.setView(view) 
stb_listview.setModel(view.model)