我试图弄明白如何从数据库中获取2D数据并将其塞进小部件中。这些数据是准静态的——一旦我获取了它,就不需要保持与数据库的连接。此外,如果我保持连接打开,但它超时,可能会使我的应用程序崩溃。我想知道QtSql中是否有某种离线数据容器或功能我不知道
据我所知,Qt只提供QsqlTableModel和QabStretctTableModel作为数据容器。如果连接断开,我还没有找到在QsqlTableModel中保存数据的方法。QAbstractTableModel本身甚至不可用;你必须对它进行子类化。如果找不到更简单或更优雅的解决方案,我很可能会选择子类化路线。有一个subclassing example here
通过代码示例,下面的代码填充SQL Server数据库中的两个组合框。单击第二个按钮并填充第二个组合框时,第一个组合框中断,应用程序中断。我希望有一种简单的方法来获取数据并将其保存在与数据库断开连接的本地容器中
from PyQt5.QtWidgets import (QApplication, QMainWindow, QComboBox, QPushButton,
QTableView, QTableView)
from PyQt5.QtSql import (QSqlQuery, QSqlQueryModel, QSqlDatabase)
import sys
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__()
self.setGeometry(300, 300, 600, 350)
self.db = QSqlDatabase.addDatabase("QODBC", 'MyDB')
self.db.setDatabaseName('Driver={SQL Server};Server=MyServer;Database=MyDB;Trusted_Connection=Yes;')
self.cb1 = QComboBox(parent=self)
self.cb1.setGeometry(25,25, 250, 50)
self.cb2 = QComboBox(parent=self)
self.cb2.setGeometry(300,25, 250, 50)
self.button1 = QPushButton('^^^ Fill Table 1 ^^^', parent=self)
self.button1.setGeometry(55,290, 200, 30)
self.button1.clicked.connect(self.fillTable1)
self.button2 = QPushButton('^^^ Fill Table 2 ^^^', parent=self)
self.button2.setGeometry(320, 290, 200, 30)
self.button2.clicked.connect(self.fillTable2)
def fillTable1(self):
print('self.db.open() ', self.db.open())
sql = 'select * from aaa.car limit 10'
query = QSqlQuery(self.db)
print("query.exec_(sql) ", query.exec_(sql))
self.t1model = QSqlQueryModel(parent = self)
self.t1model.setQuery(query)
self.cb1.setModel(self.t1model)
self.cb1.setModelColumn(0)
self.cb1.setView(QTableView(self.cb1))
def fillTable2(self):
print('self.db.open() ', self.db.open())
sql = 'select * from aaa.car limit 10'
query = QSqlQuery(self.db)
print("query.exec_(sql) ", query.exec_(sql))
self.t2model = QSqlQueryModel(parent = self)
self.t2model.setQuery(query)
self.cb2.setModel(self.t2model)
self.cb2.setModelColumn(0)
self.cb2.setView(QTableView(self.cb2))
app = QApplication(sys.argv)
main = MainWindow(None)
main.show()
sys.exit(app.exec_())
下面是一个裸体子类QAbstractTableModel。在fillFromQuery方法中为它提供一个QSqlQuery,它从查询结果中提取数据
如前所述,它不能很好地与QCompleter配合使用已编辑。现在与QCompleter一起使用与创建本地Sqlite数据库相比,这种技术的优势在于,这种OfflineTableModel将从任何SQLSelect查询向视图小部件提供脱机数据
当此离线表模型应用于OP时,原始QSqlDatabase(db)可以以关闭的方式多次打开,而不会破坏已加载离线数据的小部件。41行代码。似乎应该有一个更简单的方法来完成同样的事情
相关问题 更多 >
编程相关推荐