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