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

时间:2019-12-17 21:52:22

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

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

1 个答案:

答案 0 :(得分:1)

说明:

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

要理解该错误,我将使用以下示例:假设第一次单击时,添加了3个带有空文本的项目,并将它们分别设置为第一,第二个文本的“ a”,“ b”和“ c”和第三个项目,分别在第二次单击中添加3个新文本,其中包含空文本,因此将有6个项目:“ a”,“ b”,“ c”,“”,“”和“”,但是您替换了第一,第二和第三,带有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])