继承和 Qt 信号

Posted

技术标签:

【中文标题】继承和 Qt 信号【英文标题】:Inheritence and Qt signals 【发布时间】:2015-01-30 12:48:04 【问题描述】:

编辑: 所以现在我必须让 QLCDNumber 可点击。单击它需要重置 m_Count。 我添加了一个继承自 QLCDNumber 的类 myLC​​DNumber。它所做的只是重新定义 mouseReleaseEvent(QMouseEvent *e) 以使用 ButtonCount 实例接收到的自定义信号,它将 m_Count 设置为 0。 但它不起作用(再次)。看起来他找不到 clicked() 信号,尽管它是在 myLC​​DNumber 类中定义的。

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

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

Qt 信号继承?

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

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

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

QT 信号和槽链接时注意事项