簡體   English   中英

使用Python中的PyQt將數據從sqlite數據庫插入QTableWidget

[英]Inserting data from sqlite database to QTableWidget using PyQt in Python

我想將存儲在sqlite表中的數據插入到QTableWidget 我使用兩個for循環來查找數據和索引。 在每次迭代之后,我在控制台中打印數據並且沒有問題,但是當它顯示表格小部件時,只有第一行和最后一行填充了數據。 有什么想法解決這個問題嗎?

很明顯tblTable是一個QTableWidget

以下是代碼的這一部分:

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)

您繼續將新行插入位置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)))       

如果.rowcount值不可用(設置為1或類似),可能首先向數據庫詢問行數可能會有所幫助:

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 最后但並非最不重要的是,游標可以充當迭代器 ,這意味着您可以直接循環遍歷行而不調用.fetchall()並且將根據需要獲取行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM