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 信号继承?的主要内容,如果未能解决你的问题,请参考以下文章