PyQt5 - 从 sqlite3 复制到 QTableWidget 的 SQL 行不显示

Posted

技术标签:

【中文标题】PyQt5 - 从 sqlite3 复制到 QTableWidget 的 SQL 行不显示【英文标题】:PyQt5 - SQL rows copied from sqlite3 to QTableWidget do not show 【发布时间】:2020-03-17 17:41:02 【问题描述】:

我正在使用 Python/PyQt5 开发一个小型搜索应用程序,该应用程序浸入远程 SQL 数据库,将结果发送到本地数据库文件,然后将数据库文件中的行输出到 QTableWidget 对象。应用程序运行,创建本地 db 文件,但 QTableWidget 对象中没有显示任何内容。我单独测试了向 QTableWidget 插入行的代码部分,它确实有效。所以我不太确定接下来要寻找什么。 PS。我知道整体设计很麻烦,但我是 Python 新手,这是我能想到的最好的。


【问题讨论】:

我现在不能使用odbc,所以我不能测试你的代码(为了将来,总是尝试提供一个minimal, reproducible example),但它认为你错过了一个commitexecute(DB_Connect_Local_Insert_Command) 之后的 DB_Local_Cursor 上。 谢谢。我认为循环遍历表后的 1 次提交就足够了。最终,我可以在 SQL Lite 浏览器(sqlitebrowser.org)中打开本地 db 文件,并且所有值都在那里。实际上只是 QTableWidgetItem 网格保持空白。 是的,这可能就足够了;阅读您的代码有点困难,有太多大写和相似的变量名称,这可能会非常混乱。无论如何,提供一个minimal, reproducible example,我可以看到你正在创建一个新的表格小部件,但你从来没有将它添加到界面中,我担心问题就在那里。 谢谢。它使用 self.ui.db_local_tableWidget 而不是 db_local_tableWidget 解决。也就是说,我会听从你关于变量名和命名法的建议。您提供了很好的见解。 【参考方案1】:

诚然,我对 QT 的经验并不多,但这是我填充 QTableWidget 的方式:

(我已经根据你的例子调整了我的代码)

我使用 QT 设计器 构建了一个包含 QTableWidget 和 4 列的表单: 然后我像这样一一添加行:

# add row
row_num = db_local_tableWidget.rowCount()
db_local_tableWidget.insertRow(row_num)
db_local_tableWidget.setItem(row_num , 0, QTableWidgetItem(value1))
db_local_tableWidget.setItem(row_num , 1, QTableWidgetItem(value2))
db_local_tableWidget.setItem(row_num , 2, QTableWidgetItem(value3))
db_local_tableWidget.setItem(row_num , 3, QTableWidgetItem(value4))
db_local_tableWidget.resizeColumnsToContents()

我认为你不应该这样做:

db_local_tableWidget.setRowCount(200)
db_local_tableWidget.setColumnCount(6)

如果您事先不知道将获得多少行,这很好。只需在读取数据时添加它们即可。

我还没有检查其余的代码,但是您应该添加一些调试输出,或者记录到控制台或使用logger 类记录到文件中。首先确保您的带有双 for loop 的代码实际被执行,并且值、偏移量等是正确的。你应该能够很容易地弄清楚。 如果代码按预期运行但网格没有更新,这是另一个问题。

【讨论】:

虽然理论上最好将行数和列数设置为数据的已知范围,但这并没有什么问题,反正这不是问题。 谢谢。代码按预期运行 - 只是没有更新的网格。我可以在 SQL Lite 浏览器 (sqlitebrowser.org) 中打开本地 db 文件,并且值/偏移量都是正确的。还尝试注释掉 SetRowCount 和 SetColumnCount 行,结果是一样的。 也许您应该像这样处理表格:self.db_local_tableWidget。如果您尝试访问行数或列数等表属性会发生什么? 谢谢。这就是问题所在。我删除了 db_local_tableWidget = QTableWidget() 并按照您的建议解决了表格 - self.db_local_tableWidget 我也完全从代码中删除了本地数据库。太麻烦了,性能也很低。现在每次我进入远程服务器并找到匹配项时,只需调用 setItem 方法即可。

以上是关于PyQt5 - 从 sqlite3 复制到 QTableWidget 的 SQL 行不显示的主要内容,如果未能解决你的问题,请参考以下文章

xcode sqlite3 如何将数据库从捆绑包复制到文档文件夹?

在 sqlite3 中:将列从一个表复制到另一个表

将数据加载到 qtableWidget PyQt5

sqlite3.dll丢失怎么办

如何在 PYQT5 中从数据库进行身份验证后显示用户名

pyqt5 从下拉列选后一一添加到lineedit?