将项目添加到 QComboBox 会添加空白项目

Adding items to a QComboBox adds blank items

我正在通过 for cycle 将项目添加到 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])

解释:

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

为了理解错误,我将使用以下示例:假设在第一次点击时添加了 3 个带有空文本的项目,并将它们设置为文本 "a"、"b" 和 "c" 分别是第一个、第二个和第三个项目,在第二次单击中将添加 3 个带有空文本的新项目,因此将有 6 个项目:"a"、"b"、"c"、""、"" 和 "",但您用 3 个文本 "x"、"y" 和 "z" 替换第 1、第 2 和第 3,所以最后会有 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])