在Win 7上使用5.0.2
我有2个“ImageLoop”类[扩展QWidget],每个类占据屏幕的一半,垂直分割。每个包含一个QLabel,用于显示jpg文件列表。因此,在for循环中,我给每个小部件提供了他们的图像列表,并发出一个“listfull”信号,我已连接到一个插槽 - “playList” - 在两个小部件中的每个小部件中。不幸的是,似乎只有第一个小部件的信号才会被发出,因为只有第一个小部件才会被更新。
我是Qt编程的新手,也许我误解了插槽/信号系统。我认为下面的伪代码会为每个实例填充列表,发出信号,并且每个实例都会以快乐的方式进行 - 基本上每个小部件同时并独立显示图像。所以,问题是我错过了什么?或者我将不得不在他们自己的线程中产生每一个?
谢谢!
伪代码
for(int i=0; i<2; i++){
Create ImageLoop instance
connect(instance, SIGNAL(listfull()), instance, SLOT(playList()));
instance->FillList(arrayOfImageFileNames);
}
//inside of ImageLoop class
void FillList(arrayOfImageFileNames) {
//adds all files to an internal list
//when finished
emit listfull();
}
//inside of ImageLoop class
void playList() {
//code to loop through each image and show it
}
答案 0 :(得分:0)
for(int i=0; i<2; i++){
Create ImageLoop instance
connect(instance, SIGNAL(listfull()), instance, SLOT(playList()));
instance->FillList(arrayOfImageFileNames);
}
您希望此伪代码在两个imageLoop实例上异步调用playList()。发生的事情是Qt将listFull直接连接到playList,使得这个伪代码等同于:
for(int i=0; i<2; i++){
Create ImageLoop instance
instance->FillList(arrayOfImageFileNames);
instance->playList();
}
我的猜测是playList也是同步的,这意味着它将完成,只有那时for循环才会继续到第二个ImageLoop实例。
Qt不允许您拥有多个GUI线程,也不能从多个线程更新GUI,因此您需要显示并映像,然后异步发送信号以显示下一个图像。
有可能,你真正想要的是在完成fillList()之后启动一个计时器,在一定的延迟之后调用一个插槽showNextImage()。