1

在 Win 7 上使用 5.0.2

我有 2 个“ImageLoop”类 [扩展 QWidget],每个类占据屏幕的一半,垂直分割。每个都包含一个用于显示 jpg 文件列表的 QLabel。因此,在 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
}
4

1 回答 1

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,所以你需要 show 和 image 然后异步发送信号来显示下一个图像。

很有可能,您真正想要的是在 fillList() 完成后启动一个计时器,该计时器在一定延迟后调用插槽 showNextImage()。

于 2013-07-27T03:04:49.957 回答