1

状況:アプリケーションの中心的なウィジェットとして、タブモードのQMdiAreaがあります( QMdiAreaから継承したカスタムクラスにラップされています)。QMdiSubWindowを介して最初の QMdiSubWindow を追加してaddSubWindow()も問題ありません。つまり、ウィンドウとその内容が最大化されて、QMdiAreaのすべてのスペースが占有されます。ただし、2 番目のサブ ウィンドウを追加するとすぐに、次の問題が発生します。

問題: 2 番目のウィンドウのコンテンツが表示されず、最初のウィンドウのコンテンツが表示され続けますが (2 番目のタブに視覚的にフォーカスがあるにもかかわらず)、サイズが縮小されます。数ピクセルしか占有しません。しかし、最初のサブウィンドウ/タブに戻って (サイズが縮小されたウィジェットをクリックして自動的に最大サイズに戻るか、最初のタブヘッダーを選択して) 2 番目をもう一度選択すると、すべて問題ありません = 2 番目のタブのウィジェット/エディターが表示され、最大化されます。

ただし、2 番目のタブを閉じるまでは、最初のタブのコンテンツが (予想どおり) 表示されますが、小さいサイズでしか表示されません!

スクリーンショット: 問題の概要を示すスクリーンショット

別の関連するテスト ケース: 最初のタブが作成され、期待どおりにフル サイズで表示されます。QMainWindow全体のサイズを単純に変更すると、タブのウィジェットの周りに突然かすかな境界線が表示されます。そのため、境界のある最大化モードと通常モードが混在した状態にあるように見えます。それは新しいリードを生み出しますか?

スクリーンショット:

関連する問題の概要を示すスクリーンショット

私はこれまで明示的に定義されたレイアウトを使用していませんが、最初のタブが正常に機能し、手動で前後に切り替えた後に他のすべてのタブも同様に機能することを考えると、それがなくても機能するはずです.

明示的なレイアウト オブジェクトを設定する必要がありますか? 最初のタブでは機能するのに、2 番目のタブでは機能しないのはなぜですか?

ベースとしてのコード: これは、新しい子の追加を処理するカスタムQMdiAreaクラスで実行されるロジックです。

// Note: pEditor inherits from / is a QMdiSubWindow itself

if(!pEditor->isInitialized())
{
    pEditor->initialize();
    pEditor->setWidget(pEditor->getEditorWidget()); 
    pEditor->setInitialized(true);
}

pEditor->beforeDisplay();

addSubWindow(pEditor);
pEditor->showMaximized();

// HACK START
pExisting = subWindowList().at(0);
if(pExisting)
    setActiveSubWindow(pExisting);
// HACK END 

更新: N1ghtLight によって提案されたハックを追加しました。コーディングでそのようにマークされています。

更新 2:問題の説明を編集/修正 + スクリーンショット付きの新しいテスト ケース。

4

2 に答える 2

1

N1ightLightのサンプル プロジェクトと私自身の実装を何時間も比較した後、最終的に重要な違いに出くわしました。実際には、次の 2 つの問題がありました。

  1. 何らかの理由で、MDI サブウィンドウの作成に次の行があり、サイズの処理がうまくいかなかったようです。この行を取り除くことで、以前に提案されたハックの必要性がなくなりました。N1ghtLight によって提案されたレイアウトと組み合わせることで、すべてのサイズ変更が適切に処理されるようになりました。

    setWindowState(Qt::WindowMaximized); // do not use that state!
    
  2. タブを閉じることに関する 2 番目の部分 (1 つのタブを閉じると、期待される方法とサイズで次のタブが表示されませんでした) は、実際には Qt のドキュメントで説明されています。

    独自のサブウィンドウを作成する場合、MDI 領域で閉じたときにウィンドウを削除する場合は、Qt::WA_DeleteOnClose ウィジェット属性を設定する必要があります。そうでない場合、ウィンドウは非表示になり、MDI 領域は次のサブウィンドウをアクティブにしません。

    独自のサブ ウィンドウを作成していたので、そのフラグを設定する必要がありましたが、Qt がコンテンツ ウィジェットも自動的に削除するのを防ぎたかったので、設定しませんでした。私の解決策は、フラグを設定することですが、MDI の子が閉じられようとしているときはいつでも、ウィジェットへのリンクを削除するため、Qt はそれを削除できません。

    void CustomMDIWindow::closeEvent(QCloseEvent* pEvent)
    {
        setWidget(0);
        pEvent->accept();
    }
    

私は自分の答えを正しいものとしてマークしますが、彼のサポートが最終的な解決策を見つけることにつながったので、N1ightLightに報奨金を授与します.

于 2014-10-01T16:36:06.667 に答える
0

見苦しい回避策は、実際にはsetActiveSubWindow()2 回呼び出すことです。最初に使用可能なサブ ウィンドウを呼び出し、次に新しく作成したサブ ウィンドウを呼び出します。これは、最初のタブをクリックしてから 2 番目のタブに戻ったときの状況をエミュレートする必要があります。

于 2014-09-25T20:14:30.317 に答える