1

私のQGraphicsViewでは、地図を表示します。上端と左端に水平ルーラーと垂直ルーラーを丁重に表示する必要があります。

地図をスクロールする必要がありますが、上記の定規は固定位置に表示する必要がありますが、縮尺値を変更します。

メソッドを使用してこれを実装しようとしましたdrawForeground。マップのサイズが大きいため、可視領域のみをペイントします。update()そのため、スクロールが完了するたびに必要です。しかし、この結果は時々ちらつきます。

アプローチのような別のレイヤーを用意するのが最善だと思います。

問題にアプローチする最善の方法は何ですか?

4

2 に答える 2

2

上部と左側にルーラーを実装する正しい方法は、QGraphicsView から派生させ、コンストラクターを呼び出すことです。

// add two rulers on top and left.
setViewportMargins(20, 20, 0, 0);

// add grid layout
QGridLayout* gridLayout = new QGridLayout();
gridLayout->setSpacing(0);
gridLayout->setMargin(0);

// create rulers
hRuler = new Ruler(Qt::Horizontal);
vRuler = new Ruler(Qt::Vertical);

// add items to grid layout
QWidget* corner = new QWidget();
corner->setBackgroundRole(QPalette::Window);
corner->setFixedSize(20, 20);
gridLayout->addWidget(corner, 0, 0);
gridLayout->addWidget(hRuler, 0, 1);
gridLayout->addWidget(vRuler, 1, 0);
gridLayout->addWidget(viewport(), 1, 1);

// finally set layout
setLayout(gridLayout);

このソリューションは最初にここで提示され、非常にうまく機能します。結果は次のようになります

于 2013-12-05T10:04:15.007 に答える
0

グラフィックビューのViewportUpdateModeをFullViewportUpdateに変更して、ちらつきを回避しました。

SmartViewportUpdateを使用して、ある程度良い結果を得ることができます。

欠点は、アニメーション中に、これにより多くのプロセスパワーが必要になることです。

于 2012-04-06T02:57:36.117 に答える