2011-03-07 62 views
0

私はアプリケーションの開発にPYQTを使用しています。私の要件は、チェックボックス付きのツリービューをコンボボックスの項目の中に挿入することです。私はこれを達成する方法を知りたいですか?コンボボックス(チェックボックス付き)をコンボボックスに作成するには - PyQt

次のコードがありますが、これは機能しません。

class CheckboxInsideListbox(QWidget): 
def __init__(self, parent = None): 
    super(CheckboxInsideListbox, self).__init__(parent) 
    self.setGeometry(250,250,300,300) 
    self.MainUI() 

def MainUI(self): 
    #stb_label = QLabel("Select STB\'s") 
    stb_combobox = QComboBox() 

    length = 10 
    cb_layout = QVBoxLayout(stb_combobox) 
    for i in range(length): 
     c = QCheckBox("STB %i" % i) 
     cb_layout.addWidget(c) 

    main_layout = QVBoxLayout() 
    main_layout.addWidget(stb_combobox) 
    main_layout.addLayout(cb_layout) 



    self.setLayout(main_layout) 

ここに何か不足している場合は教えてください。

答えて

0

flagsメソッドのdataおよびSetDataメソッドでQt.CheckStateRoleをサポートするモデルとQt.ItemIsUserCheckableフラグを作成する必要があります。

私はプロジェクトに使用している例をペーストします。これはどのモデルでも使用できるQSortFilterProxyModelジェネリック実装ですが、モデル実装で同じアイデアを使用できます。このサブクラスの内部構造を使用しています。 PyQtに直接はなく、私の内部実装(self.booleanSetとself.readOnlySet)に接続されています。

def flags(self, index): 
    if not index.isValid(): 
     return Qt.ItemIsEnabled 

    if index.column() in self.booleanSet: 
     return Qt.ItemIsUserCheckable | Qt.ItemIsSelectable | Qt.ItemIsEnabled 
    elif index.column() in self.readOnlySet: 
     return Qt.ItemIsSelectable | Qt.ItemIsEnabled 
    else: 
     return QSortFilterProxyModel.flags(self, index) 

def data(self, index, role): 
    if not index.isValid(): 
     return QVariant() 

    if index.column() in self.booleanSet and role in (Qt.CheckStateRole, Qt.DisplayRole): 
     if role == Qt.CheckStateRole: 
      value = QVariant(Qt.Checked) if index.data(Qt.EditRole).toBool() else QVariant(Qt.Unchecked) 
      return value 
     else: #if role == Qt.DisplayRole: 
      return QVariant() 
    else: 
     return QSortFilterProxyModel.data(self, index, role) 

def setData(self, index, data, role): 
    if not index.isValid(): 
     return False 

    if index.column() in self.booleanSet and role == Qt.CheckStateRole: 
     value = QVariant(True) if data.toInt()[0] == Qt.Checked else QVariant(False) 
     return QSortFilterProxyModel.setData(self, index, value, Qt.EditRole) 
    else: 
     return QSortFilterProxyModel.setData(self, index, data, role) 
0

実際にレイアウトにレイアウトを適用する場合は、ウィジェットをcb_layoutに追加してみてください。さもなければあなたのサブレイアウトを取り除く。

関連する問題