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
}
여기에 문제가 될 수있는 무엇을?
connect가 true 또는 false를 반환합니까? 그것이 틀렸다면 콘솔 출력은 무엇입니까? 디버그 빌드 인 경우 일부 디버깅 정보를 출력해야합니다. –
사실 (디버그 빌드 임에도 불구하고)을 반환하고 출력을 반환하지 않습니다. –