Qt сигнализирует о наследовании? - PullRequest
3 голосов
/ 31 июля 2010

РЕДАКТИРОВАТЬ : Я предоставил ответ, но был бы рад принять еще один, который дает объяснение.

Я подкласс 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
}

В чем здесь проблема?

Ответы [ 2 ]

3 голосов
/ 01 августа 2010

Вы случайно вызываете QPushButton::mousePressEvent(e) в переопределенном методе MouseRelease3vent.

0 голосов
/ 31 июля 2010

Я наконец решил это.Решением было поместить строку emit clicked(); в MouseReleaseEvent.

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

Я до сих пор не знаю, почему вызов mousePressEvent суперкласса не позаботился об этом.Во всяком случае, это работает.

...