[英]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.