Win7上的QT5.0.2 - 独立和同时更新小部件

时间:2013-07-12 11:48:07

标签: qt qt5

在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
}

1 个答案:

答案 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()。