2016-05-26 12 views
1

Qtが新しく、Qt 5.3.1でWindowsアプリケーションを開発しています。私はメインウィンドウ(ウィンドウAと呼ばれる)を持っています。これはSOCKET IOサーバーからの会議のイベントを聞き、その中のすべてのアクティブな会議を一覧表示します。ユーザーが会議をクリックすると、メインウィンドウが非表示になり、ウィンドウ(ウィンドウB)が開いて会議に参加します。同時に、ウィンドウAは依然として会議のイベントを待ち受けており、新しい着信会議の要求を追加します。ウィンドウAは、アクティブなときにうまく動作します。私は、ウィンドウBを開き、新しい会議出席依頼が来たときにでも、新しい会議出席依頼は、私は2列の会議を表示するようにカスタマイズウィジェットやレイアウトを使用していますウィンドウに新しいコンテンツを表示できません。

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

ウィンドウA.以内に表示することはできません。 上記のスクリーンショットのように、ウィンドウAがアクティブな場合に会議1,3および4が作成され、ウィンドウAが非表示の場合に会議2が作成されます。 ミーティングを表示するMeetingListViewというウィジェットを作成しました。ウィンドウAが再びアクティブになると、MeetingListViewのスロット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(); 
    }  

しかし、それがすべてでは動作しません: 以下はforceUpdateUIソースコードです。

最新の更新: QLayoutではなくQGridLayoutから継承するレイアウトクラスを作成しましたが、問題は解決されました。ありがとう。

答えて

0

私はだと思うのは、それぞれのウィンドウに独自のイベントループがあるからです。 AコールバックからBのイベントループに入ると、Aのループが続行されなくなります。

ループを続ける(または別のスレッドでBウィンドウを手動で起動する)には、非モーダルバージョンのBを起動してから、コールバックから戻る必要があります。

Bウィンドウが表示されている間にAウィンドウを非表示にすると、Aループがアクティブなので、他のBウィンドウを開くことができなくなります。

関連する問題