QDialog:从用户输入将数据加载到 QTableWidget 时遇到问题

问题描述

我正在尝试使用 QDialog 为用户提供根据他们的输入搜索数据的功能。数据连接到数据库。

用户输入他们想要查找的内容 {self.search_name.text()} 然后在数据库 {self.c.execute} 中查询并在点击搜索后显示在 QTableWidget {package_list} 中 (self.loaddata ).

我遇到的问题是将数据加载到表中。我知道查询有效,因为如果我预先定义了我想在代码中查找的内容,该表将填充。运行脚本时我没有收到任何错误。

关于如何解决这个问题或在不使用 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 时您都在创建一个表。

如果该表已存在于您正在使用的 ui 中,则只需使用该表,但从您的代码来看,它可能不存在。

如何解决(以错误方式)

为了完整起见,我会告诉您,您可以在创建表后添加以下行:

    self.package_list.show()

这是必需的,因为当一个小部件被添加到父级并且该小部件不受布局管理时(稍后将详细介绍),如果父级已经存在,则该小部件变得可见。

第一次创建对话框时,它会创建表,因为您在 loaddata 中调用了 __init__,然后 显示对话框。在这种情况下,当显示父项时,也会显示其每个子项(即使未明确显示)除非 hide()setVisible(False) 显式调用这些小部件。之后,作为子项创建的任何新“免费”小部件必须明确显示为 show()setVisible(True)

但是,没有。

这应该没有必要。首先,因为如果一个表已经存在,就没有必要创建一个。

正确解决方案是在 __init__ 中创建表,可能通过设置那里搜索查询肯定不会改变的所有内容:标题设置、交替行颜色等

布局,布局,布局

在非常、非常极少、罕见和特殊的情况下,绝对有必要使用固定几何图形 (setGeometry(),move(),resize())小部件。经验法则是:如果您使用的是固定几何图形,那么您可能做错了。

这些是应该避免的主要原因:

  • 如果用户将窗口大小调整为较小的尺寸,某些小部件将部分或完全不可见:考虑一下屏幕尺寸比您的屏幕尺寸小的用户会发生什么情况;
  • 如果窗口被调整为更大的大小,将会有很多未使用的空间(而且看起来会很丑);
  • 您在屏幕上看到的几乎从不其他人会在他们的屏幕上看到:不同的默认字体或 DPI 可能会迫使某些小部件增加其最小尺寸,从而导致某些小部件重叠与他人;

Layout managers 始终是首选且正确的选择,您可以在 Qt Designer 内轻松创建它们。即使您想为窗口设置固定大小,也请考虑这是强制性的(请参阅上面列表的第三点)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...