2017-08-24 4 views
0

質問

子クラスと親クラスの両方からQWidgetをペイントすることはできますか?私は、次の要素を備え、ボタンのウィジェットを作成したいと思います

  • 設定可能な背景色
  • ボタンサイズ、透明アイコン
  • 設定可能に配置テキスト

QToolButtonよりもQPushButtonが好きなので、私は既知の問題に直面しています(hereおよびhere)のアイコン/テキストの配置

私のアプローチは、QPushButtonクラスを特化し、paintEventメソッドを上書きすることです(下記のコードを参照してください)。テキストを手作業で描画し、残りの部分(アイコンと背景)を親クラスに任せればいいです。しかし、今のところテキストをペイントしていないようです。

これは可能なのでしょうか、私のエラーはどこかにあるのですか、自分でペイントする必要がありますか?

コード

class MyPushButton : public QPushButton 
{ 
public: 
    MyPushButton() : QPushButton() {} 
    virtual ~MyPushButton() = default; 

protected: 
    virtual void paintEvent(QPaintEvent* e) override { 
     QPushButton::paintEvent(e); 
     QPainter p(this); 
     p.drawText(0,0, "label"); 
    } 
}; 

答えて

1

あなたはそうすることができ勿論:

をここMyPushButtonはのQPushButtonに由来しています。

void MyPushButton::paintEvent(QPaintEvent *e) 
{ 
    // This will draw everything on the push button with default palette. 
    QPushButton::paintEvent(e); 

    // Anything draw past this statement will be drawn over the real 
    // push button with all its properties intact, 
    // if you won't draw anything over, your pushbutton will look like QPushButton 
    // Now draw your custom content here: 
} 

編集1: どこ描画する伝えるために長方形を使用し、これを試してみてください: それはポイントでは動作しなかった理由を私は知らないけど。

class MyPB : public QPushButton 
{ 
protected: 
    void paintEvent(QPaintEvent *e) override 
    { 
     // This will draw everything on the push button with default palette. 
     QPushButton::paintEvent(e); 
     p.drawText(QRect(0,0, 50, 50), "HelloWorld"); 

    } 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 

    MyPB pb; 
    pb.show(); 

    return a.exec(); 
} 

編集2: それはすでに設計どおりにワークアウトしただけでなくポイントで動作します。 だから、それは0,0の位置でテキストを書く行い、次のように表示されます。

The button when text "HelloWorld" painted at 0,0 location

をので、あなたが見るならば、テキストが描画されるが、それはそれゆえすることができます、ボタンの大きさの外にありますそれを見ない。

+0

私もそう思っていましたが、成功しませんでした。おそらくそこに私はここで絵画で何か間違っているよ: 'QPainter p(this);' 'p.drawText(0,0、" label ");' – bunto1

+1

編集がうまくいきますそれは受け入れられる。なぜポイントが機能していないのかは別の問題です。ありがとう! – bunto1

+0

@ bunto1:確かに、あなたがそれを把握するために詳細を投稿してください:) – PRIME

関連する問題