Qt 信号继承?

Posted

技术标签:

【中文标题】Qt 信号继承?【英文标题】:Qt signals inheritance? 【发布时间】:2010-07-31 14:49:19 【问题描述】:

编辑:我提供了一个答案,但我很乐意接受另一个提供解释的答案。

我将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

这里可能有什么问题?

【问题讨论】:

连接返回真还是假?如果它是假的,那么控制台输出是什么?如果是调试版本,它应该打印一些调试信息。 它返回 true,并且没有输出(虽然它是一个调试版本)。 【参考方案1】:

您在覆盖的 MouseRelease3vent 方法中意外调用了 QPushButton::mousePressEvent(e)

【讨论】:

【参考方案2】:

我终于解决了。解决方案是在 MouseReleaseEvent 中放置一个emit clicked(); 行。

void ImageButton::mouseReleaseEvent(QMouseEvent *e)

    QPushButton::mousePressEvent(e);
    state = MouseOver;
    emit clicked();
    this->repaint();

我仍然不知道为什么对超类的 mousePressEvent 的调用没有解决这个问题。无论如何,它有效。

【讨论】:

在你的 mouseReleaseEvent 中,你必须调用 QPushButton::mouseReleaseEvent,而不是 QPB::mousePressEvent。

以上是关于Qt 信号继承?的主要内容,如果未能解决你的问题,请参考以下文章

继承和 Qt 信号

Qt:子类中无法识别继承的信号

qt 继承的信号不会到达插槽

使用具有多重继承的 Qt 信号和槽

Qt UI Slot 不被从基类继承的信号调用

Qt QGraphicsItem使用信号槽注意事项