我是Qt新手,我正在用Qt 5.3.1开发一个windows应用程序。我有一个主窗口(称为窗口A),它将监听来自SOCKET IO服务器的会议事件,列出其中的所有活动会议。当用户点击会议时,主窗口将隐藏,并打开一个窗口(称为窗口B)来加入会议。同时,窗口A仍在侦听会议事件,并将添加新的传入会议请求。当窗口A处于活动状态时,它运行良好。但是当我打开窗口B,新的会议请求到来时,新的会议请求不能在窗口A中显示。

我正在使用一个自定义的小部件和布局来显示2列中的会议。如上面的屏幕截图所示,会议1、3和4是在窗口A活动时创建的,而会议2是在窗口A隐藏时创建的。我创建了一个名为MeetingListView的小部件来显示会议,当窗口A再次处于活动状态时,将调用MeetingListView的slot forceUpdateUI。下面是forceUpdateUI的源代码:
void MeetingListView::forceUpdateUI(){
qDebug()<<"MeetingListView::forceUpdateUI count="<<mMeetingList.length();
int count = mLayout->count();
for(int i=count-1; i>=0; i--){
//Remove all meeting items
MeetingItem *item = (MeetingItem*)(mLayout->itemAt(i)->widget());
item->setParent(nullptr);
mLayout->removeItem(i);
}
for(int i=0; i<mMeetingList.length(); i++){
//Add all meeting items again
MeetingItem *item = mMeetingList.at(i);
mLayout->addWidget(item);
}
mLayout->update();
} 然而,它根本不起作用。
最新更新:我创建了一个从QGridLayout继承的布局类,而不是QLayout,现在问题已经解决了。谢谢。
发布于 2016-05-26 17:08:25
我认为这是因为每个窗口都有自己的事件循环。从A回调进入B的事件循环会阻止A的循环继续。
您必须启动B的非模式版本,然后从A的回调中返回,以使循环继续(或在另一个线程中手动启动B窗口)。
您可以在显示B窗口时隐藏A窗口,以防止用户打开其他B窗口(因为A循环仍处于活动状态)。
https://stackoverflow.com/questions/37454887
复制相似问题