gpt4 book ai didi

c++ - 继承和 Qt 信号

转载 作者:行者123 更新时间:2023-11-28 06:27:38 24 4
gpt4 key购买 nike

编辑:所以现在我必须让 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();
}

最佳答案

为什么要继承?这是糟糕的设计。新类型的简单对象可以很好地完成这项工作:

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);
};

关于c++ - 继承和 Qt 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28236301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com