2016-09-15 15 views
1

私のPyQTウィンドウでは、QComboBoxという表が1つの列にあります。 QComboBoxは後で通常のQTableWidgetItemに変更してテキストを表示できますか?PyQTテーブル項目をQComboBoxからQTableWidgetItemに変更する

私は以下を試しましたが、QComboBoxQTableWidgetItemのテキストに置き換えられませんでした。

myTable= QTableWidget() 
myTable.setRowCount(6) 
myTable.setColumnCount(2) 
myTable.setHorizontalHeaderLabels(QString("Name;Age;").split(";")) 
myTable.horizontalHeader().setResizeMode(QHeaderView.Stretch) 


# Populate with QComboBox in column 1 
for i, name in enumerate(nameList): 
    myTable.setItem(i, 0, QTableWidgetItem(name)) 

    ageCombo = QComboBox() 
    for option in ageComboOptions: 
     ageCombo.addItem(option) 
    myTable.setCellWidget(i, 1, ageCombo) 

# Change column 1 to QTableWidgetItem 
for i, name in enumerate(nameList): 
    myTable.setItem(i, 1, QTableWidgetItem(name)) 
+0

つもりでしたか?ユーザーが項目を選択すると、コンボボックスのシャウドが消え、セルが新しいテキストで更新されます。 – ekhumoro

答えて

3

短い答えは、ちょうどremoveCellWidgetなら、あなたが望むものを得ることです。以下のコード例。

しかし、もっと詳しく:

setCellWidgetによって設定されるようにsetItemと「ウィジェット」によって設定された「アイテム」は異なっている - 彼らは異なる役割を果たしています。このアイテムにはセルのデータが含まれています。モデルビューアーキテクチャでは、モデル内にあります。ウィジェットは表示を行っています:それはビューにあります。したがって、セルウィジェットを設定すると、そのモデルの背後にあるアイテムを使用すると予想されることがあります。しかし、QTableWidgetは、QTで使用されるフルモデルビューアーキテクチャ(例えば、QTableViewおよびQAbstractitemModelを参照)に対する簡略化されたAPIを提供する。各セルの項目を介してアクセスする独自のデフォルトモデルを提供します。次に、セル上のウィジェットを置き換えると、アイテムを一切表示せず、ウィジェットを直接制御することができます。ウィジェットを削除すると、アイテムを使用するように戻ります。ここで

は作業例です:あなたは、コンボボックスは、* *編集のためにのみ存在し、細胞内のテキストであることを

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.initUI() 

    def initUI(self): 

     self.myTable= QtGui.QTableWidget() 
     self.myTable.setRowCount(1) 
     self.myTable.setColumnCount(2) 

     item1 = QtGui.QTableWidgetItem("a") 
     self.myTable.setItem(0, 0, item1) 
     item2 = QtGui.QTableWidgetItem("b") 
     self.myTable.setItem(0, 1, item2) 

     self.setCentralWidget(self.myTable) 

     menubar = QtGui.QMenuBar(self) 
     self.setMenuBar(menubar) 
     menu = QtGui.QMenu(menubar) 
     menu.setTitle("Test") 
     action = QtGui.QAction(self) 
     action.setText("Test 1") 
     action.triggered.connect(self.test1) 
     menu.addAction(action) 
     action = QtGui.QAction(self) 
     action.setText("Test 2") 
     action.triggered.connect(self.test2) 
     menu.addAction(action) 
     menubar.addAction(menu.menuAction()) 


     self.show() 

    def test1(self): 
     self.myTable.removeCellWidget(0, 1) 

    def test2(self): 
     combo = QtGui.QComboBox() 
     combo.addItem("c") 
     combo.addItem("d") 
     self.myTable.setCellWidget(0, 1, combo) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    mw = MainWindow() 
    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    main() 
+0

「カットダウン」とは何を意味するのかよく分かりません。 'QTableWidget'は' QTableView'のサブクラスであり、そのモデルは 'QAbstractItemModel'のサブクラスです。 Qtのドキュメントによれば、それは「デフォルトモデルを持つアイテムベースのテーブルビュー」です。 'QTableWidgetItem'は実際にはモデル内のデータを操作する便利なAPIです。 – ekhumoro

+0

はい - それは明らかではありませんでした。うまくいけば改善された言葉? – strubbly

+0

これは単純化されていません - 実際は逆です。独自のカスタムモデル/ビューサブクラス(まったく同じアーキテクチャを使用して)を作成する手間を省くジェネリックコンビニエンスクラスです。また、アイテムベースのAPIを提供するために* extra *レイヤー全体を追加します。たとえば、 'QTableWidget.setCellWidget'関数は、' QAbstractItemView.setIndexWidget'を囲む項目ベースのラッパーです。 – ekhumoro

関連する問題