Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Win7上的QT5.0.2--独立和同时更新小部件_Qt_Qt5 - Fatal编程技术网

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

Win7上的QT5.0.2--独立和同时更新小部件,qt,qt5,Qt,Qt5,在Win 7上使用5.0.2 我有两个“ImageLoop”类[扩展了QWidget],每个类占据了屏幕的一半,垂直分割。每个包含一个用于显示jpg文件列表的QLabel。因此,在for循环中,我给每个小部件提供了它们的图像列表,并发出一个“listfull”信号,我已将其连接到两个小部件中的一个插槽——“playList”。不幸的是,似乎只有第一个小部件的信号被发出,因为只有第一个小部件被更新 我不熟悉Qt编程,可能我误解了插槽/信号系统。我认为下面的伪代码会,对于每个实例,填充列表,发出信号

在Win 7上使用5.0.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
}
for(int i=0;iFillList(ArrayOfImageFileName);
}
//ImageLoop类的内部
无效填充列表(ArrayOfImageFileName){
//将所有文件添加到内部列表
//完成时
emit listfull();
}
//ImageLoop类的内部
作废播放列表(){
//循环遍历每个图像并显示它的代码
}
for(int i=0;iFillList(ArrayOfImageFileName);
}
您希望此伪代码在两个imageLoop实例上异步调用playList()。实际情况是Qt直接将listFull连接到playList,使此伪代码等效于:

for(int i=0; i<2; i++){
 Create ImageLoop instance
 instance->FillList(arrayOfImageFileNames);
 instance->playList();
}
for(int i=0;iFillList(ArrayOfImageFileName);
实例->播放列表();
}
我猜playList也是同步的,这意味着它将完成,只有到那时for循环才会继续到第二个ImageLoop实例

Qt不允许有多个GUI线程,也不能从多个线程更新GUI,因此需要显示和映像,然后异步发送信号以显示下一个映像


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

您的slot/signals理论和伪代码看起来不错,但是如果您发布实际代码,那么您可能会得到您想要的答案。
for(int i=0; i<2; i++){
 Create ImageLoop instance
 instance->FillList(arrayOfImageFileNames);
 instance->playList();
}