2010-07-31 4 views
3

EDIT : 답변을 제공해 주었지만 설명을 제공하는 또 다른 대답을 기꺼이 받아 들일 수 있습니다.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

connect가 true 또는 false를 반환합니까? 그것이 틀렸다면 콘솔 출력은 무엇입니까? 디버그 빌드 인 경우 일부 디버깅 정보를 출력해야합니다. –

+0

사실 (디버그 빌드 임에도 불구하고)을 반환하고 출력을 반환하지 않습니다. –

답변

3

을 우회 된 MouseRelease3vent 방법으로 우연히 호출하고 있습니다.

0

마지막으로 해결했습니다. 해결책은 MouseReleaseEvent에 emit clicked(); 행을 넣는 것입니다.

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

나는 왜 슈퍼 클래스 'mousePressEvent에 대한 호출이 그것을 처리하지 않았는지 모르겠다. 어쨌든 작동합니다.

+1

mouseReleaseEvent에서 QPB :: mousePressEvent가 아닌 QPushButton :: mouseReleaseEvent를 호출해야합니다. –

관련 문제