1

だから、私は非常に簡単な質問があります:QTableWidgetから入力を取得し、それをいくつかのリストに入れるにはどうすればよいですか(最初の列を最初のリストに、2番目の列を2番目のリストに...)?

私はグーグルで検索しましたが、実際には何も見つかりませんでした...

アップデート:

実際、私はこれを理解しました:

self.tableWidget.cellChanged.connect(self.cellchanged)


def cellchanged(self):
    cur = self.tableWidget.currentColumn()
    cur2 = self.tableWidget.currentRow()
    y = children[cur]
    text = self.tableWidget.currentItem().text()
    y.insert(cur2, text)

しかし、テーブルを更新すると、このエラーが発生します(表示されるだけで、プログラムに悪影響はありません)。

def updatetable(self):
        self.tableWidget.setRowCount(0)
        self.tableWidget.setRowCount(100)
        r=0
        c=0
        for x in children:
            for i in x:
                newItem = QtGui.QTableWidgetItem(i)
                self.tableWidget.setItem(r, c, newItem)
                r += 1
            r = 0
            c += 1

エラー:

  if self.tableWidget.currentItem().text():
AttributeError: 'NoneType' object has no attribute 'text'

Update3:

解決しました:

    self.tableWidget.cellChanged.connect(self.cellchanged)


def cellchanged(self):
    cur = self.tableWidget.currentColumn()
    cur2 = self.tableWidget.currentRow()
    y = children[cur]
    self.tableWidget.cellActivated.connect(self.cell) 
def cell(self):
    text = self.tableWidget.currentItem().text()
    y.insert(cur2, text)
4

3 に答える 3

2

これは、単一のQStandardItemModelでQTableViewと一連のQListViewオブジェクトを使用する方法の例です。このアプローチの利点は、モデルという1つの場所でデータを維持するだけでよいことです。ビューは、モデルにあるものをすべて反映しているだけです。

この例では、各リストは異なる列を表示するように設定されています。データを変更するとどうなるかを見てください。どこでも更新されます。これは、データが変更されたときにモデルが内部的に信号を発信しているためです。ビューは単にモデルをリッスンします。QListViewを使用せず、基本的なリストデータ構造が必要な場合は、モデルから出力される信号に手動で接続し、オンデマンドでデータを更新します。

from PyQt4 import QtCore, QtGui

class Widget(QtGui.QWidget):

    def __init__(self, *args, **kwargs):
        super(Widget, self).__init__(*args, **kwargs)
        self.resize(800,600)

        self.vlayout = QtGui.QVBoxLayout(self)
        self.table = QtGui.QTableView()
        self.vlayout.addWidget(self.table)

        self.hlayout = QtGui.QHBoxLayout()
        self.list1 = QtGui.QListView()
        self.list2 = QtGui.QListView()
        self.list3 = QtGui.QListView()      
        self.hlayout.addWidget(self.list1)
        self.hlayout.addWidget(self.list2)
        self.hlayout.addWidget(self.list3)

        self.vlayout.addLayout(self.hlayout)

        self.model = QtGui.QStandardItemModel(10,10,self)
        self.table.setModel(self.model)

        self.list1.setModel(self.model)
        self.list1.setModelColumn(0)
        self.list2.setModel(self.model)
        self.list2.setModelColumn(1)
        self.list3.setModel(self.model)
        self.list3.setModelColumn(2)

        self.populateTable()

    def populateTable(self):
        for row in xrange(10):
            for col in xrange(10):
                item = QtGui.QStandardItem('%d-%d' % (row, col))
                self.model.setItem(row, col, item)


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication([])
    window = Widget()
    window.show()
    window.raise_()
    sys.exit(app.exec_())
于 2012-07-14T17:36:14.107 に答える
1

テーブルを反復処理する必要があります。QTableWidgetにはrowCount()行が含まれています。item(row、column)メソッドでアイテムにアクセスできます。移入については、 QListWidgetのドキュメントも参照してください。

コードは次のようになります。

def copy_table_column_to_list_widget(table, column, list_widget)
    for row in range(table.rowCount()):
        text = table.item(row, column).text()
        list_widget.addItem(QtGui.QListWidgetItem(text))

copy_table_column_to_list_widget(table, 0, list_widget1)
copy_table_column_to_list_widget(table, 1, list_widget2)
# and so on... or write a loop

upd

def table_to_list(table):
    result = []
    num_rows, num_cols = table.rowCount(), table.columntCount()
    for col in range(num_cols):
        rows = []
        for row in range(num_rows):
            item = table.item(row, col)
            rows.append(item.text() if item else '')
        result.append(rows)
    return result

結果は次の形式になります。

[['11', '12', '13'], ['21', '22', '23']]
于 2012-07-13T19:52:32.760 に答える
0

PyQt5でよりシンプルに..

self.gui.table_widget.cellChanged.connect(self.cell_changed)

@pyqtSlot()
def cell_changed(self):
    try:
        self.cell = self.gui.table_widget.currentItem()
        self.triggered = self.cell.text()
        print(self.triggered)
    except:
        pass
于 2019-03-31T15:55:41.493 に答える