2017-05-16 5 views
2

私はQDockWidgetsという数字を持っています。すべてが単一のQMainWindowにドッキングされています。QMainWindowが最大化されているときにQDockWidget :: restoreGeometryが正しく機能しない

私はshowEventを上書きしており、ベースクラスに上のイベントを通過した後、私はドックウィジェットのジオメトリを復元しています

void DockWidget::showEvent(QShowEvent* ev) 
{ 
    QDockWidget::showEvent(ev); 

    QByteArray byte_array = settings_.value(id + ".geometry").toByteArray(); 

    LOG("rest: %s", QString(byte_array.toHex())); 

    QDockWidget::restoreGeometry(byte_array); 
} 
私は私のドックウィジェットのそれぞれについて、 saveSettingsを呼び出しています私の QMainWindow::closeEvent

私のドックウィジェット」は、

void MainWindow::closeEvent(QCloseEvent* ev) 
{ 
    QList<DockWidget*> dock_widgets = findChildren<DockWidget*>(); 

    for (DockWidget* dock_widget : dock_widgets) 
     dock_widget->saveSettings(); 

    QMainWindow::closeEvent(ev); 
} 

S saveSettings機能は、私は、ディスクへsaveGeometryの結果を記述します。ウィジェットが正しく復元されていない最大化されたときに、私のQMainWindowは、最大化されていないときに、このながら

void DockWidget::saveSettings() 
{ 
    QByteArray byte_array = QDockWidget::saveGeometry(); 

    LOG("save: %s", QString(byte_array.toHex())); 

    settings_.setValue(id + ".geometry", byte_array); 
    settings_.sync(); 
} 

に動作します。

this image私はウィジェットを終了する直前に配置しました。 (インラインで画像が大きすぎるためリンクされています)

this image私のアプリケーションをリロードすると、ウィジェットのジオメトリが正しく読み込まれません。

上記の関数では、保存して読み込んでいるジオメトリ文字列をログに記録することができます。私は、設定が正しく保存され、再び復元し、何とかそれは

アプリを閉じて正常に動作していないしていることを自分自身に証明されている

。状態を保存:

save: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780 

は、アプリを開きます。状態を復元:(ここ進データが正確に保存されたものと一致)

rest: 01d9d0cb000200000000053f000000640000077f000001a00000053f000000640000077f000001a000000000000000000780 

は何も触れなかった、再びアプリを閉じる:形状が異なっているとして(16進数のデータは、今異なって、マークを参照してください以下)

save: 01d9d0cb000200000000053f000000640000077f0000014e0000053f000000640000077f0000014e00000000000000000780 
                ^       ^

これは、ウィンドウが最大化されていない場合は発生しません。

これはQtのバグですか?正しく機能していませんか?

私はUbuntu 16.04でQt 5.5を使用しています。

答えて

1

これはQtのバグです。具体的にはQTBUG-46620、おそらくはQTBUG-16252です。

QTBUG-46620のバグレポートには回避策が記載されていますので、お試しください。あなたは(あなたが個別に各ドックウィンドウのジオメトリを保存する必要はありませんのでご注意)アプリケーションを閉じると、メインウィンドウの形状と、メインウィンドウの状態が保存されていることを確認し、そもそも:

void MainWindow::closeEvent(QCloseEvent* ev) 
{ 
    settings_.setValue("geometry", saveGeometry()); 
    settings_.setValue("state", saveState()); 
} 

を次に、復元ジオメトリ次のように:

void MainWindow::closeEvent(QCloseEvent* ev) 
{ 
    settings_.setValue("geometry", saveGeometry()); 
    settings_.setValue("state", saveState()); 
    settings_.setValue("maximized", isMaximized()); 
} 

restoreGeometry(settings.value("geometry").toByteArray()); 
if (isMaximized()) 
{ 
    setGeometry(QApplication::desktop()->availableGeometry(this)); 
} 
restoreState(settings.value("windowState").toByteArray()); 

をあなたは上記の回避策に問題がある場合、あなたはまた、ウィンドウの最大化された状態を保存する必要があります

restoreGeometry(settings.value("geometry").toByteArray()); 
if (settings.value("maximized").toBool()) 
{ 
    showMaximized(); 
    setGeometry(QApplication::desktop()->availableGeometry(this)); 
} 
restoreState(settings.value("windowState").toByteArray()); 

これらの回避策により、一部のプラットフォームでいくつかの警告メッセージが生成されることがあります。

+0

ありがとうございました。最初の提案は完全に機能しました。実際に必要な変更は、 'saveGeometry' /' restoreGeometry'の代わりに 'geometry'と' setGeometry'を使うことでした。 –

関連する問題