QT自定义信号和槽
Posted chechen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT自定义信号和槽相关的知识,希望对你有一定的参考价值。
最近项目中使用到QT,在此记录一下QT的核心,信号与槽:
QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
sender:信号发出者
signal:发送信号
receiver:信号接收者
method:信号处理者
新建一个QT窗口,在窗口上放一个按钮,点击按钮然后关闭窗口
SignalAndSlot.h
#include <QtWidgets/QWidget> #include "ui_SignalAndSlot.h" #include <QPushButton> class SignalAndSlot : public QWidget { Q_OBJECT public: SignalAndSlot(QWidget *parent = Q_NULLPTR); private: QPushButton b1; private: Ui::SignalAndSlotClass ui; };
SignalAndSlot.cpp
#include "SignalAndSlot.h" SignalAndSlot::SignalAndSlot(QWidget *parent) : QWidget(parent) { ui.setupUi(this); b1.setParent(this); b1.setText(QStringLiteral("关闭"));//QStringLiteral解决VS中文乱码 b1.move(100, 100); connect(&b1, &QPushButton::released, this, &SignalAndSlot::close); }
一. 槽函数:
QT5:任意的成员函数,普通全局函数,静态函数
槽函数需要和信号一直(参数,返回值)
由于信号没有返回值,所以槽函数一定没有返回值
我们自定义槽函数
void closeWidget(); //自定义槽函数 //槽函数里执行关闭操作 void SignalAndSlot::closeWidget() { close(); } ..... connect(&b1, &QPushButton::released, this, &SignalAndSlot::closeWidget);//自定义槽函数
二.自定义信号实例
我们实现两个窗口互相切换,在主创中新建一个按钮,叫切换到子窗口(这个过程是子窗口显示,主窗口隐藏), 新建一个QT子窗口,子窗口上有一个按钮叫切换到主窗口(子窗口隐藏,主窗口显示);
1.新建子窗口
2.在主窗口中定义SubWidget窗口成员变量和主窗口的切换函数
这样实现,就可以从主窗口切换到子窗口。
3.从子窗口切换到主窗口
在子窗口定义信号和发送信号的槽函数
SubWidget.h
#include <QWidget> #include "ui_SubWidget.h" class SubWidget : public QWidget { Q_OBJECT public: SubWidget(QWidget *parent = Q_NULLPTR); ~SubWidget(); signals: /* * 信号必须有signals 关键字来声明 * 信号没有返回值,但可以有参数 * 信号就是函数声明,只需声明,无须实现 * 使用:emit mysignal(); * 信号可以重载 */ void MySignal(); public: void SendSignal();//发送信号的槽 private: Ui::SubWidget ui; };
SubWidget.cpp
#include "SubWidget.h" #include <QPushButton> SubWidget::SubWidget(QWidget *parent) : QWidget(parent) { ui.setupUi(this); QPushButton* pChange = new QPushButton(this); pChange->setText(QStringLiteral("切换到主窗口")); pChange->move(100, 0); connect(pChange, &QPushButton::released, this, &SubWidget::SendSignal);//点击按钮,槽函数触发一个信号 } SubWidget::~SubWidget() { } void SubWidget::SendSignal() { emit MySignal(); }
4.在主窗口里面处理这个自定义信号
.... connect(&sub, &SubWidget::MySignal, this, &SignalAndSlot::DealSubSignal); } void SignalAndSlot::DealSubSignal() { show(); sub.hide(); }
效果:
以上是关于QT自定义信号和槽的主要内容,如果未能解决你的问题,请参考以下文章