QDialog:Trouble 将用户输入的数据加载到 QTableWidget
QDialog:Trouble Loading Data Into QTableWidget From A User Input
我正在尝试让 QDialog 为用户提供根据他们的输入搜索数据的功能。数据已连接到数据库。
用户键入他们想要查找的内容 {self.search_name.text()} 然后在数据库中查询 {self.c.execute} 并在之后显示在 QTableWidget {package_list} 中单击搜索 (self.loaddata)。
我遇到的问题是将数据加载到 table。我知道该查询有效,因为如果我预定义我想在我的代码中查找的内容,table 将会填充。 运行 脚本时我没有收到任何错误。
关于如何解决这个问题或者不使用 QDialog 实现相同目标的其他方法有什么想法吗?
class SearchPackageByNameDialog(QDialog):
def __init__(self, *args, **kwargs):
super(SearchPackageByNameDialog, self).__init__(*args, **kwargs)
self.setStyleSheet("background-color: rgb(28, 66, 32);\n"
"font: 10pt \"Courier New\";\n"
"")
loadUi('GUIs/PackageLookupNameDailog.ui',self)
self.btn_search.clicked.connect(self.loaddata)
self.loaddata()
def loaddata(self):
searchrol = self.search_name.text()
searchresult = '"'+searchrol+'"'
self.conn = sqlite3.connect("database.db")
self.c = self.conn.cursor()
self.c.execute("CREATE TABLE IF NOT EXISTS Packages(Tracking_Number TEXT PRIMARY KEY,Recipient TEXT,DateIn TEXT,DateOut TEXT)")
self.c.close()
self.package_list = QtWidgets.QTableWidget(self)
self.package_list.setGeometry(QtCore.QRect(10, 110, 600, 300))
self.package_list.setAlternatingRowColors(True)
self.package_list.setColumnCount(4)
self.package_list.setColumnWidth(0,200)
self.package_list.setColumnWidth(1,200)
self.package_list.setColumnWidth(2,100)
self.package_list.setColumnWidth(3,100)
self.package_list.horizontalHeader().setCascadingSectionResizes(False)
self.package_list.horizontalHeader().setSortIndicatorShown(False)
self.package_list.horizontalHeader().setStretchLastSection(True)
self.package_list.verticalHeader().setVisible(False)
self.package_list.verticalHeader().setCascadingSectionResizes(False)
self.package_list.verticalHeader().setStretchLastSection(False)
self.package_list.setHorizontalHeaderLabels(("Tracking Number", "Recipient", "Date In", "Date Out"))
self.package_list.setStyleSheet("font: 14pt 'Courier New';background-color: rgb(114, 104, 112);\n"
"alternate-background-color: rgb(124, 136, 126);\n"
"border-color: rgb(160, 141, 131);\n"
"gridline-color: rgb(145, 150, 127);")
self.connection = sqlite3.connect("database.db")
query = "SELECT * from Packages WHERE recipient IS "+str(searchresult)
result = self.connection.execute(query)
print(query)
self.package_list.setRowCount(0)
for row_number, row_data in enumerate(result):
self.package_list.insertRow(row_number)
for column_number, data in enumerate(row_data):
self.package_list.setItem(row_number, column_number,QTableWidgetItem(str(data)))
self.connection.close()
问题是您每次调用 loaddata
时都会创建一个 new table。
如果 table 已经存在于您正在使用的 ui 中,那么就使用它,但从您的代码来看它可能不存在。
如何解决(错误的方式)
为了完整起见,我会告诉你,你 可以 在创建 table:
后添加以下行
self.package_list.show()
这是要求ui红色,因为当一个小部件被添加到 parent 并且该小部件不受布局管理(稍后会详细介绍)时,该小部件会 [=59=如果 parent 已经可见,则不 可见。
第一次创建对话框时,它会创建 table,因为您在 __init__
中调用了 loaddata
,然后 然后 显示对话框。在这种情况下,当显示 parent 时,它的每个 children 也会显示(即使它们没有明确显示)unless hide()
或 setVisible(False)
在这些小部件上被显式调用。之后,任何创建为 child 的新“免费”小部件必须 明确显示为 show()
或 setVisible(True)
。
但是,没有。
这应该没有必要。首先,因为如果 table 已经存在,就没有必要创建一个。
正确的 解决方案是在 __init__
中创建 table,可能通过设置 那里 一切这肯定不会因搜索查询而改变:headers 设置、交替行颜色等
布局,布局,布局
有非常、非常 少数、罕见和特定的情况绝对有必要使用固定几何形状(setGeometry()
、move()
、resize()
) 用于小部件。经验法则是:如果您使用的是固定几何图形,那么您可能做错了。
这些是应该避免的主要原因:
- 如果用户将 window 的尺寸调整到更小的尺寸,一些小部件将变得部分或完全不可见:考虑屏幕尺寸比您的屏幕尺寸小的用户会发生什么情况;
- 如果 window 调整到 更大的 大小,将会有很多未使用的 space (而且看起来会很难看);
- 您在屏幕上看到的几乎绝不会其他人在他们屏幕上看到的:不同的默认字体或 DPI 可能会强制某些小部件增加其最小尺寸,结果一些小部件会与其他小部件重叠;
Layout managers are always the first and right choice, and you can easily create them within Qt Designer。即使您想为 window 设置固定大小,请务必考虑这是强制性的(请参阅上面列表的第三点)。
我正在尝试让 QDialog 为用户提供根据他们的输入搜索数据的功能。数据已连接到数据库。
用户键入他们想要查找的内容 {self.search_name.text()} 然后在数据库中查询 {self.c.execute} 并在之后显示在 QTableWidget {package_list} 中单击搜索 (self.loaddata)。
我遇到的问题是将数据加载到 table。我知道该查询有效,因为如果我预定义我想在我的代码中查找的内容,table 将会填充。 运行 脚本时我没有收到任何错误。
关于如何解决这个问题或者不使用 QDialog 实现相同目标的其他方法有什么想法吗?
class SearchPackageByNameDialog(QDialog):
def __init__(self, *args, **kwargs):
super(SearchPackageByNameDialog, self).__init__(*args, **kwargs)
self.setStyleSheet("background-color: rgb(28, 66, 32);\n"
"font: 10pt \"Courier New\";\n"
"")
loadUi('GUIs/PackageLookupNameDailog.ui',self)
self.btn_search.clicked.connect(self.loaddata)
self.loaddata()
def loaddata(self):
searchrol = self.search_name.text()
searchresult = '"'+searchrol+'"'
self.conn = sqlite3.connect("database.db")
self.c = self.conn.cursor()
self.c.execute("CREATE TABLE IF NOT EXISTS Packages(Tracking_Number TEXT PRIMARY KEY,Recipient TEXT,DateIn TEXT,DateOut TEXT)")
self.c.close()
self.package_list = QtWidgets.QTableWidget(self)
self.package_list.setGeometry(QtCore.QRect(10, 110, 600, 300))
self.package_list.setAlternatingRowColors(True)
self.package_list.setColumnCount(4)
self.package_list.setColumnWidth(0,200)
self.package_list.setColumnWidth(1,200)
self.package_list.setColumnWidth(2,100)
self.package_list.setColumnWidth(3,100)
self.package_list.horizontalHeader().setCascadingSectionResizes(False)
self.package_list.horizontalHeader().setSortIndicatorShown(False)
self.package_list.horizontalHeader().setStretchLastSection(True)
self.package_list.verticalHeader().setVisible(False)
self.package_list.verticalHeader().setCascadingSectionResizes(False)
self.package_list.verticalHeader().setStretchLastSection(False)
self.package_list.setHorizontalHeaderLabels(("Tracking Number", "Recipient", "Date In", "Date Out"))
self.package_list.setStyleSheet("font: 14pt 'Courier New';background-color: rgb(114, 104, 112);\n"
"alternate-background-color: rgb(124, 136, 126);\n"
"border-color: rgb(160, 141, 131);\n"
"gridline-color: rgb(145, 150, 127);")
self.connection = sqlite3.connect("database.db")
query = "SELECT * from Packages WHERE recipient IS "+str(searchresult)
result = self.connection.execute(query)
print(query)
self.package_list.setRowCount(0)
for row_number, row_data in enumerate(result):
self.package_list.insertRow(row_number)
for column_number, data in enumerate(row_data):
self.package_list.setItem(row_number, column_number,QTableWidgetItem(str(data)))
self.connection.close()
问题是您每次调用 loaddata
时都会创建一个 new table。
如果 table 已经存在于您正在使用的 ui 中,那么就使用它,但从您的代码来看它可能不存在。
如何解决(错误的方式)
为了完整起见,我会告诉你,你 可以 在创建 table:
后添加以下行 self.package_list.show()
这是要求ui红色,因为当一个小部件被添加到 parent 并且该小部件不受布局管理(稍后会详细介绍)时,该小部件会 [=59=如果 parent 已经可见,则不 可见。
第一次创建对话框时,它会创建 table,因为您在 __init__
中调用了 loaddata
,然后 然后 显示对话框。在这种情况下,当显示 parent 时,它的每个 children 也会显示(即使它们没有明确显示)unless hide()
或 setVisible(False)
在这些小部件上被显式调用。之后,任何创建为 child 的新“免费”小部件必须 明确显示为 show()
或 setVisible(True)
。
但是,没有。
这应该没有必要。首先,因为如果 table 已经存在,就没有必要创建一个。
正确的 解决方案是在 __init__
中创建 table,可能通过设置 那里 一切这肯定不会因搜索查询而改变:headers 设置、交替行颜色等
布局,布局,布局
有非常、非常 少数、罕见和特定的情况绝对有必要使用固定几何形状(setGeometry()
、move()
、resize()
) 用于小部件。经验法则是:如果您使用的是固定几何图形,那么您可能做错了。
这些是应该避免的主要原因:
- 如果用户将 window 的尺寸调整到更小的尺寸,一些小部件将变得部分或完全不可见:考虑屏幕尺寸比您的屏幕尺寸小的用户会发生什么情况;
- 如果 window 调整到 更大的 大小,将会有很多未使用的 space (而且看起来会很难看);
- 您在屏幕上看到的几乎绝不会其他人在他们屏幕上看到的:不同的默认字体或 DPI 可能会强制某些小部件增加其最小尺寸,结果一些小部件会与其他小部件重叠;
Layout managers are always the first and right choice, and you can easily create them within Qt Designer。即使您想为 window 设置固定大小,请务必考虑这是强制性的(请参阅上面列表的第三点)。