2011-07-05 18 views
0

QPushbuutonでテキストを設定中に問題に直面しています。 ボタンにテキストを設定しましたが、決して表示されません。QPushbutton settext QTの問題?

QPushbuttonのmousepress、mousereleaseイベントのカスタムクラスを作成しました。

私はこのクラスにQPushbuttonを宣伝します。

私のコードは次のようになります。

//Customclass.h

列挙ButtonState {通常、 マウスオーバー、 をプッシュ}。私のページで

class CustomButtonStates : public QPushButton 
{ 
    Q_OBJECT 


public: 
    explicit CustomButtonStates(QWidget *parent = 0,const QString &normal = "", const QString &active = "",QString strText = ""); 
    virtual ~CustomButtonStates(); 
    void mousePressEvent(QMouseEvent *event); 
    void mouseReleaseEvent(QMouseEvent *event); 
    void paintEvent(QPaintEvent *e); 



private: 

    QString m_PixmapNormal; 
    QString m_PixmapActive; 
    QString m_strText; 
    bool m_bPressed; 
    ButtonState state; 

public: 
    QImage *NormalImage; 
    QImage *MouseOverImage; 
    QImage *PushedImage; 




}; 

// .cppファイル

CustomButtonStates::CustomButtonStates(QWidget *parent,const QString &normal, const QString &active,QString strText) : 
    QPushButton(parent) 
{ 

    m_PixmapNormal = normal ; 
    m_PixmapActive = active ; 
    m_strText = strText ; 
    state = Normal; 



} 


void CustomButtonStates::mousePressEvent(QMouseEvent *event) 
{ 
    QPushButton::mousePressEvent(event); 
    state = Pushed;  
    this->repaint(); 

} 

void CustomButtonStates::mouseReleaseEvent(QMouseEvent *event) 
{ 
    QPushButton::mouseReleaseEvent(event); 
    state = Normal; 
    emit clicked(); 
    this->repaint(); 

} 

void CustomButtonStates::paintEvent(QPaintEvent *event) 
{ 
    QPainter painter(this); 
    QImage *pic = NULL; 

    NormalImage = new QImage(m_PixmapNormal); 
    PushedImage = new QImage(m_PixmapActive); 
    switch (state) 
    { 
    case Normal: 
     pic = NormalImage; 
     break; 
    case MouseOver: 
     pic = MouseOverImage; 
     break; 
    case Pushed: 
     pic = PushedImage; 
     break; 
    default: 
     pic = NormalImage; 
     break; 
    } 

    painter.drawImage(0, 0, *pic); 
} 

CustomButtonStates::~CustomButtonStates() 
{ 
    delete NormalImage; 
    delete MouseOverImage; 
    delete PushedImage; 
} 

CustomButtonStates *btnMain ; 
btnMain = new CustomButtonStates(this,":/Sampl1.png",":/Sample2.png","Users"); 
    btnMain->setText("Users"); 
    btnMain->setGeometry(QRect(3,6,65,33)); 

    connect(btnMain,SIGNAL(clicked()),this,SLOT(on_btnUsers_clicked())); 

答えて

1

テキストとあなたデータ(画像/ピックスマップ)を除いQPushButtonで塗装のもののいずれかを必要としない場合、私はあなたが代わりに直接QAbstractButtonの継承少し深く行くことができます示唆しています。

あなたボタンであなたは、あなたのイメージを描画するペイントイベントを再実装し、QPainterdrawText()方法の一つで、このバックグラウンドを超えて最後のテキストでテキストメンバを追加(プラスsetText(const QString&...)text()をaccesors)します。

paintEventは、次のようになります。

void YourButton::paintEvent(QPaintEvent* event) 
{ 
    QPainter painter(this); 
    //hereadd some logic to determine witch pixmap goes background 
    QPixmap* selectedPixmap ... 
    painter.drawPixmap(rect(), *selectedPixmap); 
    //here add some logic to set painter pen and brush 
    //according to button status (enabled/checked/...) 
    painter.drawText(rect(), Qt::AlignCenter, text()); 
} 

あなたは、私が直接QLabelと前方テキストアクセサを使用することをお勧めテキストあなたに適用されるワードラップ、またはQtの「CSS」スタイルのような手の込んだものを必要とする場合このQLabel。この場合、ボタンの矩形の上端にオーバーレイラベルを正しく設定するには、変更するときはいつでもresizeEventを再実装することを忘れないでください。

0

のQPushButtonを呼び出してみてください::最初のカスタムpainteventでpaintevent(イベント)、その後、カスタムQImageのを適用します。

+0

カスタムペイントイベントの最後の行にQPushButton :: paintevent(event)を追加しました。どの画像にボタンが割り当てられていないのですか? – user662285

+0

ペイントイベントを最初に呼び出すと、イメージが適用されます。私の間違い。それが動作しない場合は、QImageをペイントした後に自分でテキストをペイントする必要があります(実際にはQPixmap btwでなければなりません) –

+0

テキストをペイントする方法は? – user662285

1

オーバーライドされたpaintEventメソッドでテキストを手動でペイントする必要があります。 しかし、OrcunCが提案したように、代わりにStylesheetを使用する方が簡単です。

QPushButton pb; 
pb.setStyleSheet("background-image: url(:/Users/nav_on.png);"); 
+0

しかし、私は100回のページがある場合、私はそれを110回行う必要があります...手動でテキストをペイントする方法は、マウスのプレスとリリースでイメージを設定するカスタムクラスを作成していますか? – user662285