【问题标题】:Adding items to a QComboBox adds blank items向 QComboBox 添加项目会添加空白项目
【发布时间】:2020-04-10 10:51:12
【问题描述】:

我通过 for 循环 将项目添加到 QComboBox,该循环位于通过按下按钮调用的函数中。正如您在下面的代码中看到的,我正在从数据库中调用数据,特别是从 SQLite,它通过一个变量进行过滤,即:depid。该函数在调用时执行良好并填充了各自的QComboBox,但是再次调用时,虽然它仍然保留了各自的元素,但它添加了一个空白项,当我再次按下按钮时, QComboBox保留元素,保留前一个空白项并添加另一个,即每次调用该函数时都会添加一个空白项。

Cur.execute("SELECT * FROM workers WHERE departament = "+str(depid))
workfilter = Cur.fetchall()

for n,data in enumerate(workfilter):
    self.BoxFilteredWorer.addItem("")
    self.BoxFilteredWorer.setItemText(n, data[1])

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qcombobox


    【解决方案1】:

    说明:

    addItem(s) 方法在最终位置添加带有文本“s”的新项目,setItemText(i, s) 将第 i 个项目的文本替换为“s”。

    为了理解错误,我将使用以下示例:假设在第一次单击时添加了 3 个带有空文本的项目,并将它们设置为第一个、第二个的文本“a”、“b”和“c”和第 3 项,分别在第二次单击时,将添加 3 个带有空文本的新项,因此将有 6 个项:“a”、“b”、“c”、“”、“”和“”,但您替换1st, 2nd 和 3rd 有 3 个文本 "x", "y" 和 "z" 所以最后会有 6 个项目: "x", "y", "z", "", "" y "" .

    解决办法:

    addItem()setItemText() 没有必要一起使用,只需清理循环前的 QComboBox 并添加新项即可,此外不需要枚举。

    另一方面,不要使用连接来创建 SQL 查询,因为它会使您的代码容易受到 SQL 注入的影响,而是使用占位符。

    Cur.execute("SELECT * FROM workers WHERE departament = ?", (depid,))
    workfilter = Cur.fetchall()
    
    self.BoxFilteredWorer.clear()
    for data in workfilter:
        self.BoxFilteredWorer.addItem(data[1])
    

    【讨论】:

    • 绝对完美。谢谢你。 enumerate 函数发生的事情是我在教程中看到了它,好吧,因为它起作用了,所以我离开了它,根据教程确定每个项目的索引,我在 PyQt5 中很新。另一件事,该查询将如何改进?使用您提到的占位符方法。
    • @Jalkhov 1) 不要只是复制代码,理解它并分析它为什么工作以及在什么情况下它可能会失败。 2)占位符是“?”对于您已经申请的内容,请阅读realpython.com/prevent-python-sql-injection
    猜你喜欢
    • 2021-04-12
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2021-05-20
    相关资源
    最近更新 更多