2012-06-14 5 views
5

私はQDockWidgetを継承するQtクラスを持っています。そのクラスには別のウィジェットが含まれています。 QDockWidget継承クラスで、含まれているウィジェットの上にものを描画する関数を定義する可能性はありますか?ペイントが含まれているウィジェットから独立しているが、継承クラスにリンクするように。 QDodckWidgetのドッキングウィジェットの上にペイント/ドロー

はありがとう

答えて

8

確かに可能です。実際には、それはかなり簡単です。あなたはあなたのQDockWidgetに他のすべての上に座っている子ウィジェットを配置する必要があります。それを行うには、あなたがドックウィジェットに追加する最後の子ウィジェットでなければなりません。そのウィジェットはバックグラウンドを描画してはならないし、ドックウィジェットの子を引き継ぐことができます。ウィジェットのサイズは、親ウィジェットのサイズを追跡する必要があります。

以下は、コンパイル可能な自己完結型の例です。

Screenshot of the example

// https://github.com/KubaO/stackoverflown/tree/master/questions/overlay-line-11034838 
#include <QtGui> 
#if QT_VERSION > QT_VERSION_CHECK(5,0,0) 
#include <QtWidgets> 
#endif 

class Line : public QWidget { 
    void paintEvent(QPaintEvent *) override { 
     QPainter p{this}; 
     p.setRenderHint(QPainter::Antialiasing); 
     p.drawLine(rect().topLeft(), rect().bottomRight()); 
    } 
public: 
    using QWidget::QWidget; 
}; 

class Window : public QWidget { 
    QHBoxLayout layout{this}; 
    QLabel left{"Left", this}; 
    QLabel right{"Right", this}; 
    Line line{this}; 

    void resizeEvent(QResizeEvent *) override { 
     line.setGeometry(rect()); 
    } 
public: 
    Window(QWidget * parent = nullptr) : QWidget{parent} { 
     left.setFrameStyle(QFrame::Box | QFrame::Raised); 
     layout.addWidget(&left); 
     right.setFrameStyle(QFrame::Box | QFrame::Raised); 
     layout.addWidget(&right); 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication app{argc, argv}; 
    Window w; 
    w.show(); 
    return app.exec(); 
} 
0

私の知る限り:いいえ

ウィジェットは深さ順に描かれているので、彼らはその後すぐに間違いなく(更新されていない場合どのようなあなたのQDockWidget派生クラス塗料、含まれるウィジェットによってオーバー描画されますペイントの更新は子ウィジェットに伝播されるため)。

+0

深さ順に描画することはあなたがそれらの上に置かれ、余分なウィジェットを使ってウィジェットの基礎となる上に描画することができます正確に何をしていること。それは簡単です:) IIRC Qt 4.1で導入された新しいウィジェットレンダリングモデルに小道具が移動します。 –

+0

@KubaOberあなたは絶対に正しいですが、それはOPが尋ねたものではありません。 OPは、コンテナーウィジェットが子ウィジェットをペイントできるかどうかを尋ねました。答えは「いいえ」です。あなたの解決策は考えられる回避策ですが、含まれているウィジェットの上に 'QDockWidget'派生クラスペインティングを含まないので、OPの質問には答えません。 – cmannett85

+1

これは解決策を提供します。コンテナウィジェットは自由に子ウィジェットを追加することができます。もちろん、ペイントコードはコンテナの 'paintEvent'には入っていませんが、誰がそれを気にしていますか? –

関連する問題