4

sqliteテーブルに保存されているデータをに挿入したいQTableWidgetfor2つのループを使用して、データとインデックスを検索します。各反復の後、コンソールでデータを印刷します。それで問題ありませんが、テーブルウィジェットが表示されると、最初の行と最後の行だけがデータで埋められます。この問題を解決するためのアイデアはありますか?

それtblTableQTableWidget

コードのこの部分は次のとおりです。

cursor.execute('''SELECT * FROM MyTable''')
for index , form in enumerate(cursor.fetchall()):
    i = 0
    for item in form:
        print(str(item))
        self.tblTable.setItem(index, i, QtGui.QTableWidgetItem(str(item)))       
        i = i + 1
    self.tblTable.insertRow(1)
4

1 に答える 1

9

新しい行を位置 1 に挿入し続けます。前に入力したデータが 1 行上に移動し、その時点で次のループでそのデータを上書きします。

したがって、最初の反復ではすべてが行 0 に挿入され、インデックス 1 に行が追加されます。次に、行 1 をデータで更新し、位置 1 に別の行を挿入して、以前に変更された行を行 2 に移動させます。次のループでは、行 2 のデータを上書きし、位置 1 に別の空の行を挿入し、データのある行を位置 3 に移動して、もう一度上書きします。

最初に行数を 0 に設定し、必要に応じて行を挿入してから、列データを挿入ます。

cursor.execute('''SELECT * FROM MyTable''')
self.tblTable.setRowCount(0)
for row, form in enumerate(cursor):
    self.tblTable.insertRow(row)
    for column, item in enumerate(form):
        print(str(item))
        self.tblTable.setItem(row, column, QtGui.QTableWidgetItem(str(item)))       

私は QtTableWidget に精通していません。行数を事前に設定するだけでなく、行を継続的に追加しても実行されない可能性があります。

クエリでsqlite のcursor.rowcount属性が適切に更新されている場合 (常に更新されるとは限りません)、.setRowCountその値で呼び出した方がよいでしょう:

cursor.execute('''SELECT * FROM MyTable''')
self.tblTable.setRowCount(cursor.rowcount)
for row, form in enumerate(cursor):
    for column, item in enumerate(form):
        self.tblTable.setItem(row, column, QtGui.QTableWidgetItem(str(item)))       

値が利用できない場合 (1 などに設定されている場合.rowcount)、最初にデータベースに行数を問い合わせることが役立つ場合があります。

rowcount = cursor.execute('''SELECT COUNT(*) FROM MyTable''').fetchone()[0]
self.tblTable.setRowCount(rowcount)
cursor.execute('''SELECT * FROM MyTable''')
for row, form in enumerate(cursor):
    for column, item in enumerate(form):
        self.tblTable.setItem(row, column, QtGui.QTableWidgetItem(str(item)))       

上記のすべての例で、変数の名前をその使用に少し近い名前に変更enumerateし、アイテム ループでも使用しました。最後になりましたが、カーソルはiteratorとして機能できます。つまり、呼び出しを行わずに行を直接ループでき.fetchall()、行は必要に応じてフェッチされます。

于 2012-08-01T08:40:16.660 に答える