继承和 Qt 信号
Posted
技术标签:
【中文标题】继承和 Qt 信号【英文标题】:Inheritence and Qt signals 【发布时间】:2015-01-30 12:48:04 【问题描述】:编辑: 所以现在我必须让 QLCDNumber 可点击。单击它需要重置 m_Count。 我添加了一个继承自 QLCDNumber 的类 myLCDNumber。它所做的只是重新定义 mouseReleaseEvent(QMouseEvent *e) 以使用 ButtonCount 实例接收到的自定义信号,它将 m_Count 设置为 0。 但它不起作用(再次)。看起来他找不到 clicked() 信号,尽管它是在 myLCDNumber 类中定义的。
myLCDNumber.h
#ifndef MYLCDNUMBER_H
#define MYLCDNUMBER_H
#include <iostream>
#include <QObject>
#include <QApplication>
#include <QPushButton>
#include <QLCDNumber>
class myLCDNumber : public QLCDNumber
public:
myLCDNumber(uint numDigits);
~myLCDNumber();
void mouseReleaseEvent(QMouseEvent *e);
signals:
void clicked();
;
#endif // MYLCDNUMBER_H
myLCDNumber.cpp
#include <QMouseEvent>
#include "mylcdnumber.h"
myLCDNumber::myLCDNumber(uint numDigits):QLCDNumber(numDigits)
myLCDNumber::~myLCDNumber()
void myLCDNumber::mouseReleaseEvent(QMouseEvent *e)
qDebug("je suis bien dans le click");
if (e->button() == Qt::LeftButton)
emit clicked();
我应该基于 QPushButton 创建一个 ButtonCount 类。 它所做的只是计算它被使用的次数(通过类内的变量)。 单击它会增加 m_Count 变量(通过 ButtonCount.Increment()),然后将 valueChanged 信号(以 m_Count 变量作为值)发送到 QLCDNumber 小部件上的 display() 插槽
由于某种原因,单击按钮不会按预期增加 LCD 计数器。我认为每次单击按钮时都会正确修改 m_Count,但我无法验证它(没有可用的调试)。
ButtonCount.h
#ifndef BUTTONCOUNT_H
#define BUTTONCOUNT_H
#include <iostream>
#include <QObject>
#include <QApplication>
#include <QPushButton>
class ButtonCount : public QPushButton
Q_OBJECT
public:
ButtonCount(const QString & text, QWidget * parent = 0);
~ButtonCount();
int m_Count;
public slots:
void Increment();
signals:
void valueChanged(int);
;
#endif // BUTTONCOUNT_H
ButtonCount.cpp
#include "buttoncount.h"
ButtonCount::ButtonCount(const QString &text, QWidget *parent):QPushButton(text, parent)
m_Count = 0;
QObject::connect(this,SIGNAL(clicked()),this,SLOT(Increment()));
ButtonCount::~ButtonCount()
void ButtonCount::Increment()
m_Count++;
emit valueChanged(m_Count);
main.cpp
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QLCDNumber>
#include <QLayout>
#include <QDial>
#include "buttoncount.h"
int main(int argc, char *argv[])
QApplication a(argc, argv);
QWidget window;
ButtonCount *button_c = new ButtonCount("Count clicks");
myLCDNumber *lcd = new myLCDNumber(2);
lcd->setSegmentStyle(QLCDNumber::Filled);
QObject::connect(button_c,SIGNAL(valueChanged(int)),lcd,SLOT(display(int)));
QObject::connect(lcd,SIGNAL(clicked()),button_c,SLOT(reset()));
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(lcd);
layout->addWidget(button_c);
window.setLayout(layout);
window.show();
return a.exec();
【问题讨论】:
没有真正需要子类化 pushButton,只需在其他地方保存计数。 我构建了您的示例,即使从 QPushButton 冗余继承(如@ratchetfreak 所说),它也可以正常工作(LCD 上的数字增量应该是)。请提供有关问题的更多信息。 确保在构建项目之前运行 qmake。可能信号/插槽连接已损坏。虽然代码看起来是正确的。 好的,现在它可以工作了(不知道如何,刚刚重新启动我的计算机并使用 Qt Creator 清理/重新编译)。 【参考方案1】:为什么要继承?这是一个糟糕的设计。新类型的简单对象很好地完成了这项工作:
class ButtonCounter : public QObject
Q_OBJECT
int mCounter;
public:
Q_PROPERTY(int counter
READ counter
WRITE setCounter
NOTIFY counterChanged )
explicit ButtonCounter(QObject *parent) :
QObject(parent),
mCounter(0)
explicit ButtonCounter(QAbstractButton *parent) :
QObject(parent),
mCounter(0)
connect(parent, SIGNAL(clicked()), this, SLOT(countOne()));
int counter() const
return mCounter;
public slots:
void setCounter(int value)
if (mCounter != value)
mCounter = value;
emmit counterChanged(mCounter);
void countOne()
setCounter(mCounter+1);
public signals:
void counterChanged(int newValue);
;
【讨论】:
我使用继承是因为这是我被要求做的。以上是关于继承和 Qt 信号的主要内容,如果未能解决你的问题,请参考以下文章