0

これは、Qt Simulator (電話用) で発生します。ウィジェットの領域の一部のみを更新しようとしていますが、代わりにウィジェット全体が更新されます。

説明のために、次のコードを使用します。

void Widget::mousePressEvent(QMouseEvent *event)
{
    update(0, 0, 10, 10);
}

void Widget::paintEvent(QPaintEvent *event)
{
    qDebug() << event->rect();
}

ウィジェットをクリックすると、次のデバッグ出力が表示されます。

QRect(0,0 458x832)

ウィジェットの全領域です。

ここで何が間違っていますか?


編集

Linux で同じコードを実行したところ、正常に動作し、デバッグ出力は

QRect(0,0 10x10)

4

3 に答える 3

0

私が見たほとんどの GUI フレームワークでは、アプリケーション ウィンドウ/ウィジェットの一部だけを更新することはできません。使用している update(x,y,x,y) のように、API にいくつかの長方形を更新する関数がある場合でも、少なくとも指定された長方形を更新する必要があることをフレームワークに通知するだけであり、フレームワークは画面のより大きな部分。

電話 Qt でどのように機能するかはわかりませんが、デスクトップ バージョンではこの方法で行われます。これは、ほとんどの OS の GUI アプリケーションでは「画像」がどこにも保存されないためです。最小化してからウィンドウを表示すると、表面全体を再作成する必要があります。 .

これはすべて、何かをペイントしてから、必要に応じてカスタム四角形に他のペイント操作を追加するという仮定に頼ることができないことを意味します。すべてを最初から再描画し、ペイントの最適化をフレームワークに任せることができる、一般的な「ペイント」関数を実装する必要があります。

于 2012-07-30T16:15:29.647 に答える
0

私は電話の Qt に慣れていません。しかし、他の何かがウィジェット全体の更新をトリガーしている可能性があります。Qtは、1 つのイベント ループ処理中に呼び出されたものpaintEventすべてに対して 1 つを送信します。update()したがって、コードが部分的な更新を要求している可能性がありますが、ウィンドウ システムのどこかが何らかの形で影響を受け、完全な更新が要求される場合があります。

repaint()それがあなたのpaintEventを正しい領域に送るかどうか試してみてください。

于 2012-07-29T15:02:34.170 に答える
0

このバグは Qt Simulator にのみ存在することが判明しました。実際の電話自体では、更新リージョンが正しく渡されていました。QMessageBoxの座標で を表示して、これをテストしましたevent->rect

于 2012-08-04T07:57:13.497 に答える