Qt

2012年10月27日 (土)

QGraphicsSceneを複数のQGraphicsViewから参照したとき

一つのQGraphicsSceneを複数のQGraphicsViewを参照することができます。各々のViewに対して操作を行えば、下記のようなMulti Viewが簡単にできあがります。
M_view_sample01
さて、ここで、Sceneに対する操作を考えます。あるViewでは、グリッドを表示させますが、別のViewでは、グリッドを表示させないというのはどうすればいいでしょうか。
これは、各ViewのQGraphicsView::viewport()のPaintイベントを捕まえて、その中で、SceneのItemの表示を切り替えてあげればいいみたいです。
以下、実行結果です。
M_view_sample02
Multi Viewを考えたとき、Sceneに対する操作が障害となっており、各々のViewに各々のSceneを設定して、Sceneの同期機構を組もうかと思っていましたが、無事解決できました。

| | コメント (0) | トラックバック (0)

2012年9月23日 (日)

起動時にQDockWidgetの状態を復元する

QDockWidget::saveGeomerty() / QDockWidget::restoreGeometry()を使えば、ウインドウの位置/状態を簡単に前回終了状態に戻せるとのことなので、下記のようなコードを書いてみました。

/* --------------------------------------------------------------------------------------
 *  復元
 * -------------------------------------------------------------------------------------- */
void CMessageWindow::restoreSettings( QSettings* settings ) {
    QVariant v = settings->value( STATE_MESSAGE_WINDOW_GEOMETRY );
    if( !v.isNull() ) {
        m_dock_widget->restoreGeometry( v.toByteArray() );
    }
}
/* --------------------------------------------------------------------------------------
 *  保存
 * -------------------------------------------------------------------------------------- */
void CMessageWindow::saveSettings( QSettings* settings ) {
    settings->setValue( STATE_MESSAGE_WINDOW_GEOMETRY, m_dock_widget->saveGeometry() );
}

だけど、元に戻るのは、Dockがメインウインドウにくっついていないときだけで、半日ほど悩みました。

いろいろやった結果、メインウインドウ(QMainWindow)の状態を保持/復元してあげれば、くっついているDockにも適用されました。

| | コメント (0) | トラックバック (0)