Qt中的信号和槽函数。

1:写一个close按钮当单击此按钮时就执行槽函数,而关闭窗口.

 1 #include "slot.h"
 2 #include <QApplication>
 3 #include<QPushButton>
 4 #include<time.h>
 5 #ifndef SLOT_H
 6 #define SLOT_H
 7 #include <QMainWindow>
 8 #include <QObject>
 9 #include <QWidget>
10 class Slot : public QWidget
11 {
12     Q_OBJECT
13 public:
14     explicit Slot(QWidget *parent = nullptr);
15     Slot(const Slot &);
16     Slot &operator=(const Slot &);
17     ~Slot();
19 signals:
21 public slots:
23 private:
24     QSharedDataPointer<SlotData> data;
25 };
26 class SlotData : public QSharedData
27 {
28 public:
30 };
31 Slot::Slot(QWidget *parent) : QWidget(parent), data(new SlotData) //Slot的构造函数.
32 {
33 QPushButton *btn = new QPushButton; //new关键字是c++动态分配那一节讲的。
34 btn->setParent(this); //this代表QWidget对象.
35 btn->setText("close");
36 QPushButton *btn1;
37 connect(btn,&QPushButton::pressed,this,&Slot::close);
38 /*
39  * btn:btn是信号的发出者,作为connect()的第一个参数,该参数为发出者的地址,btn是指针类型所以btn是地址信息。
40  * &QPushButton::pressed:  指明btn在遇到用户给的presses的信号时才给this(Slot类的对象)发出信号让this执行槽函数。
41  * this:  信号的承受者也就是被执行者。
42  * close:为槽函数,
43  */
44 /*
45  * 自定义信号和槽,普通函数的用法
46  * Qt:任意的成员函数,普通全局函数,静态函数.
47  * 槽函数需要和信号一致(参数,返回值)
48  * 由于信号都是没有返回值,使用槽函数一定没有返回值.
49  *
50 */
51 }
52 Slot::~Slot()  //Slot的析构函数.
53 {
55 }

 2:自定义信号实现主窗口与子窗口的来回切换:

  //基本原理:在主窗口类中定义子窗口对象,这样就可以指使子窗口干事了,子窗口发送一个自定义的信号主窗口,主窗口就处理信号。

#  main.cpp:

 1 #include "widget.h"
 3 #include <QApplication>
 5 int main(int argc, char *argv[])
 6 {
 7     QApplication a(argc, argv); //查找QApplication()的相关资料
 8     9    
10     Widget w; //创建widget.cpp对象
11     w.setWindowTitle("父窗口");
12     w.show();
13 
14     return a.exec();
15 }

#  mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class myWidget : public QWidget
{
    Q_OBJECT
public:
    explicit myWidget(QWidget *parent = nullptr);
/*定义信号时必须加上关键字signals.
 * 信号没有返回值,但可以有参数.
 * 信号就是函数声明,只需声明,无需定义。
 * 使用emit发送.
*/
signals:
void my_singals(); //自定义信号

public slots:
    void my_slot();//自定义发送信号的槽函数.
};

#endif // MYWIDGET_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include "mywidget.h"
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; } //命名空间 Ui
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
     myWidget my_w; //在主窗口中定义子窗口对象.
    void close_sonwidget(); //接受到子窗口信号时执行的槽函数.
private:
    Ui::Widget *ui;
//自定义创建主窗口的槽函数.由于是私有成员,在类外不能使用对象直接调用,和不能在类外进行定义.
    void create_widget()
    {
            my_w.setWindowTitle("子窗口");
            my_w.show();
/*
 * 解释这里为什么不用w.hide()来隐藏主窗口.由于主窗口对象定义于主函数中,和其他函数不在同一个作用域块.注意每一个函数都是一个作用域块。
 * 我们会发现非主函数的普通变量在调用完函数后就会被释放.所以除开主函数外其他普通函数中的普通变量不能跨作用域使用。
 * 还有注意:主函数的内存空间是最后释放的,这是因为在他里面规定了去调用外面的函数,函数只有调用结束后内存才会被释放.只要存在一个变量还在使用,
 * 函数就不会调用结束,也就不会释放内存.如闭包,python中的装饰器就是通过这种原理实现的。
*/
            this->hide(); //this是代表当前对象.
    }

};
#endif // WIDGET_H

# widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "QPushButton"
#include <QDebug>
//#include "mypushbutton.h"  //自定义的按钮
Widget::Widget(QWidget *parent):QWidget(parent), ui(new Ui::Widget) //Widget为继承自QWidget类,该处为类外定义构造函数.
{
            ui->setupUi(this);
            QPushButton *btn1 = new QPushButton;
            btn1->setParent(this);
            btn1->setText("切换到子窗口");
            connect(btn1,&QPushButton::pressed,this,&Widget::create_widget);
            connect(&my_w,&myWidget::my_singals,this,&Widget::close_sonwidget); //处理子窗口信号.
}
void Widget::close_sonwidget()
{
    my_w.hide(); //子窗口关闭.
    this->show(); //主窗口显示.
}
Widget::~Widget()
{
    qDebug()<<"释放Widget窗口即父窗口"<<endl;
    delete ui;
}

    

# mywidget.cpp

#include "mywidget.h"
#include <QPushButton>
myWidget::myWidget(QWidget *parent) : QWidget(parent)  //myWidget类外定义构造函数.
{
QPushButton *btn2 = new QPushButton;
btn2->setParent(this);
btn2->setText("切换到主窗口");
connect(btn2,&QPushButton::pressed,this,&myWidget::my_slot);//子窗口发送信号,主窗口接受信号在干事.
}
void myWidget::my_slot()
{
    emit my_singals(); //发送信号
}
原文地址:https://www.cnblogs.com/1314bjwg/p/12269819.html