修改: 所以现在我必须使QLCDNumber可点击。单击它需要重置m_Count。 我添加了一个继承自QLCDNumber的类myLCDNumber。它所做的就是重新定义mouseReleaseEvent(QMouseEvent * e)以使用ButtonCount实例接收的自定义信号,该实例将m_Count设置为0。 但它不起作用(再次)。虽然在myLCDNumber类中定义了clicked()信号,但看起来他无法找到它。
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();
}
答案 0 :(得分: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);
};