2010-07-31 59 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