在我做过的一个项目中,需要利用QT实现一个人脸考勤打卡的界面,人脸打卡成功之后,会在界面的右边区域显示一条打卡信息。界面实现如下。
整个实现过程还算比较顺利,只是在动态添加打卡信息到右侧的列表时,发现Item并不显示,而是出现了一个透明的框。后来查看Qt的开发文档才发现,QT不允许直接在非UI线程中添加Item。而我开发时,担心在添加过程中,会导致UI卡顿的问题,所以正是将该操作放到线程里面的。
后来根据文档提示,改为利用Qt的信号机制来实现该功能。目前已经正常运行了。具体实现,部分代码如下。
#绑定槽函数
self.signal_has_new_item.connect(self.addItem)
#槽函数
def addItem(self,name,time):
try:
list_item = QtWidgets.QListWidgetItem(self.ui.list_wigets)
list_item.setBackground(QtGui.QColor(17, 23, 47))
size = list_item.sizeHint()
list_item.setSizeHint(QtCore.QSize(size.width(), 60))
self.ui.list_wigets.addItem(list_item)
sig_in = SignInItemWidget()
sig_in.setName(str(name))
sig_in.setTime(str(time))
self.ui.list_wigets.setItemWidget(list_item, sig_in)
self.ui.list_wigets.setCurrentRow(self.ui.list_wigets.count() - 1)
except:
print(traceback.print_exc())
#触发
if self.debug:
self.signal_has_new_item.emit('test', '09:00:00')