2010-07-31 58 views
3

編輯:我提供了一個答案,但我很樂意接受另一個提供解釋。Qt信號的繼承?

我爲QPushButton添加了一些功能,但在將clicked信號連接到一個插槽後,它不會被調用。如果我使用香草QPushButton,並且不改變其他任何東西,它就會起作用。下面的代碼:

/// --- imagebutton.h 

#ifndef IMAGEBUTTON_H 
#define IMAGEBUTTON_H 

#include <QPushButton> 
#include <QImage> 

enum ButtonState 
{ 
    Normal, 
    MouseOver, 
    Pushed 
}; 

class ImageButton : public QPushButton 
{ 
    Q_OBJECT 
private: 
    ButtonState state; 

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

public: 
    explicit ImageButton(QWidget *parent = 0); 
    virtual ~ImageButton(); 
    void enterEvent(QEvent *e); 
    void leaveEvent(QEvent *e); 
    void mousePressEvent(QMouseEvent *e); 
    void mouseReleaseEvent(QMouseEvent *e); 
    void paintEvent(QPaintEvent *e); 

signals: 

public slots: 

}; 

#endif // IMAGEBUTTON_H 

/// --- imagebutton.cpp 

#include <QPainter> 

#include "imagebutton.h" 

ImageButton::ImageButton(QWidget *parent) : 
    QPushButton(parent) 
{ 
    state = Normal; 
} 

void ImageButton::enterEvent(QEvent *e) 
{ 
    QPushButton::enterEvent(e); 
    state = MouseOver; 
    this->repaint(); 
} 

void ImageButton::leaveEvent(QEvent *e) 
{ 
    QPushButton::leaveEvent(e); 
    state = Normal; 
    this->repaint(); 
} 

void ImageButton::mousePressEvent(QMouseEvent *e) 
{ 
    QPushButton::mousePressEvent(e); 
    state = Pushed; 
    this->repaint(); 
} 

void ImageButton::mouseReleaseEvent(QMouseEvent *e) 
{ 
    QPushButton::mousePressEvent(e); 
    state = MouseOver; 
    this->repaint(); 
} 

void ImageButton::paintEvent(QPaintEvent *e) 
{ 
    QPainter painter(this); 

    QImage *pic = NULL; 

    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); 
} 

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

這就是我如何連接信號:

void MainWindow::initInterface() 
{ 
    ImageButton *btn_start = new ImageButton(ui->page); 
    btn_start->setText("start"); 
    connect(btn_start, SIGNAL(clicked()), this, SLOT(btn_clicked())); 
    // more buttons connected to the same slot 
} 

什麼可能是這裏的問題?

+0

連接是否返回true或false?如果它是錯誤的控制檯輸出是什麼?它應該打印一些調試信息,如果它是一個調試版本。 – 2010-07-31 14:52:20

+0

它返回true,並且沒有輸出(儘管它是一個調試版本)。 – 2010-07-31 14:58:19

回答

3

您在撥打MouseRelease3vent方法時意外撥打QPushButton::mousePressEvent(e)

0

我終於解決了。解決方案是在MouseReleaseEvent中放入emit clicked();行。

void ImageButton::mouseReleaseEvent(QMouseEvent *e) 
{ 
    QPushButton::mousePressEvent(e); 
    state = MouseOver; 
    emit clicked(); 
    this->repaint(); 
} 

我仍然不知道爲什麼調用超類'mousePressEvent沒有照顧到這一點。無論如何,它的作品。

+1

在您的mouseReleaseEvent中,您必須調用QPushButton :: mouseReleaseEvent,而不是QPB :: mousePressEvent。 – 2010-07-31 23:19:36