2016-05-26 23 views
1

Ich bin neu in Qt, und ich entwickle eine Windows-Anwendung mit Qt 5.3.1. Ich habe ein Hauptfenster (genannt Fenster A), das Besprechungsereignisse von SOCKET IO Server abhören und alle aktiven Besprechungen darin auflisten wird. Wenn ein Benutzer auf ein Meeting klickt, wird das Hauptfenster ausgeblendet und ein Fenster (Fenster B) geöffnet, um dem Meeting beizutreten. Zur gleichen Zeit hört Fenster A immer noch Besprechungsereignisse ab und fügt neue eingehende Besprechungsanfragen hinzu. Fenster A funktioniert gut, wenn es aktiv ist. Aber wenn ich Fenster B öffnen und neue Besprechungsanfragen kommen, können neue Besprechungsanfragen zeigen nicht innerhalb des Fensters A.Kann keine neuen Inhalte im Fenster anzeigen, die im Hintergrund hinzugefügt werden

There are 4 meetings in below screen shot(Window A), 1,3,4 are created when Window A is active, 2nd is created when Window A is hidden

Ich verwende ein individuelles Widget und das Layout Treffen in zwei Spalten zu zeigen. Wie oben im Screenshot gezeigt, werden die Besprechungen 1, 3 und 4 erstellt, wenn Fenster A aktiv ist, während Besprechung 2 erstellt wird, wenn Fenster A ausgeblendet ist. Ich habe ein Widget mit dem Namen MeetingListView erstellt, um Meetings anzuzeigen, und wenn Window A wieder aktiv ist, wird der Slot forceUpdateUI von MeetingListView aufgerufen. Im Folgenden sind forceUpdateUI Quellcode:

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(); 
    }  

Es ist jedoch überhaupt nicht funktionieren.

Letzte Aktualisierung: Ich habe eine Layout-Klasse von QGridLayout, anstelle von QLayout erben erstellt, jetzt wurde das Problem gelöst. Vielen Dank.

Antwort

0

Ich denke, ist es, weil jedes Fenster seine eigene Ereignisschleife hat. Wenn man in der Ereignisschleife von B von einem A-Callback ausgeht, wird verhindert, dass die Schleife von A fortfährt.

Sie müssen eine nicht-modale Version von B starten und dann vom Rückruf von A zurückkehren, um die Schleife fortzusetzen (oder das B-Fenster in einem anderen Thread manuell zu starten).

Sie können das A-Fenster ausblenden, während das B angezeigt wird, um zu verhindern, dass der Benutzer andere B-Fenster öffnet (da die A-Schleife noch aktiv ist).

Verwandte Themen