【问题标题】:QDialog:Trouble Loading Data Into QTableWidget From A User InputQDialog:从用户输入将数据加载到 QTableWidget 时出现问题
【发布时间】:2021-01-06 20:51:44
【问题描述】:

我正在尝试创建一个 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()   

【问题讨论】:

    标签: python pyqt5 qt-designer qtablewidget qdialog


    【解决方案1】:

    问题是您每次调用loaddata 时都在创建一个 表。

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

    如何解决(以错误的方式)

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

        self.package_list.show()
    

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

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

    但是,没有。

    这应该不是必需的。首先,因为如果表已经存在,则无需创建。

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

    布局、布局、布局

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

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

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

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

    【讨论】:

    • 老实说,我做了简单的方法只是为了确保我可以让它工作。但我现在正在研究有关布局的最佳实践。我确实希望用户能够全屏显示应用程序。
    • @Matt 应用是否全屏显示这一事实并不重要:关键是 UI必须 能够根据可用大小调整其内容(该空间是由用户还是系统设置的并不重要)。请注意,布局并不总是您的朋友:有时需要妥协;但它们更好的选择,因为替代方案几乎总是糟糕(从用户和程序员的角度来看)。
    • 我遇到的问题是我愿意处理何种程度的妥协。我仍在学习如何进行布局,但要保持与我目前拥有的标签和按钮相同的尺寸。我确信有办法,但我只需要继续我的研究。这是我第一次创建 GUI。
    • @Matt 您可以根据需要设置小部件的最大和/或最小尺寸(同时设置最大值和最小值使尺寸固定)并仍然使用布局:这样您就可以更好地控制小部件尺寸,但您也可以确保您的 UI 将始终在任何屏幕(具有合理的)尺寸上布局良好。我建议您阅读文档(问题末尾的两个链接)并开始在设计器中进行一些实验,以便您更好地了解它们的实际工作方式。玩得开心:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    相关资源
    最近更新 更多