利用回调函数模拟信号与槽,仅供参考学习使用,实际编程中此方法不可取。
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLabel>
namespace Ui {
class Widget;
}
class PushButton;
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
public:
static void callbackFunc(QString);
private slots:
void slot();
private:
Ui::Widget *ui;
PushButton *pushButton;
static QLabel *m_label;
};
#include <QPushButton>
class PushButton : public QPushButton
{
Q_OBJECT
public:
explicit PushButton(const QString &text, QWidget *parent = nullptr);
void setCallback(void(*func)(QString));
public:
void(*m_callbackFunc)(QString string);
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
//静态成员属于类作用域,但不属于类对象,它的生命周期和普通的静态变量一样,程序运行时进行分配内存和初始化,程序结束时则被释放。所以不能在类的构造函数中进行初始化。
QLabel *Widget::m_label;
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_label = new QLabel("here is text", this);
pushButton = new PushButton("click on me", this);
pushButton->move(100, 100);
pushButton->setCallback(callbackFunc);//此处类似于connect
connect(pushButton, SIGNAL(clicked()), this, SLOT(slot()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::callbackFunc(QString str)//此处即为槽
{
m_label->setText(str);
}
void Widget::slot()
{
pushButton->m_callbackFunc(pushButton->text());//此处类似于发信号
}
PushButton::PushButton(const QString &text, QWidget *parent) :
QPushButton(parent)
{
setText(text);
}
void PushButton::setCallback(void (*func)(QString))
{
m_callbackFunc = func;
}