06黑马QT笔记之两个独立窗口利用自定义信号和槽实现互相通信

06黑马QT笔记之两个独立窗口利用自定义信号和槽实现互相通信

1 例子,执行程序有两个窗口,各窗口各有一个按钮,窗口1按下自己隐藏,显示窗口2。窗口2按下按钮自己隐藏,窗口1显示。两者互相切换。

2 做法:
1)先创建第一个窗口类,即第一个窗口,然后创建一个成员按钮,将其显示。

2)然后点击添加新文件,添加一个窗口2类,同样的在窗口中添加一个成员按钮,将其显示。

3)由于窗口2虽然创建完成,但是还没有显示,但是我们不直接将其再主函数或者窗口2的构造函数显示。而是将其放在窗口1,作为其成员变量。在窗口1的构造函数中显示,这样两个窗口就可以显示,但仍没联系。

4)两个独立窗口建立联系,首先在窗口1的构造函数中,使用connect实现点击按钮1隐藏本窗口,显示窗口2。

5)上面实现了主窗口的功能。接下来是子窗口的。首先利用子窗口的按钮2,按下触发自定义的信号void sendSignal(),信号和槽函数实际都是函数。然后主窗口connect接收该信号并定义槽函数处理,即隐藏2显示1。

3 自定义信号的注意事项:(与槽函数都是函数实现)
1)必须要有signals关键字声明。
2)信号没有返回值,但是可以有参数。
3)信号就是函数的声明,无须定义。
4)使用方法:用emit mySignal();来使用。
5)信号可以重载。(下一篇的说到)

4 对比槽函数注意事项记忆:
自定义参函数注意事项(Qt5):
1)自定义槽函数可以是类成员函数(用得最多)、全局普通函数、静态函数。
2)槽函数返回值、参数类型要与信号一致(槽函数的尾部可以少于信号 但前面的必须相同)。
3)由于信号返回值为空void,所以槽函数也肯定没有返回值
4) Qt4的槽函数必须带有slots关键字,且要有访问权限。

5 下面给出代码。主要看上面 思路。
1)项目文件:可以不可,因为没有改动,全是自动生成。

#-------------------------------------------------
#
# Project created by QtCreator 2020-04-22T11:06:46
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = 06_Windows_SelfSolt
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        mywidget.cpp \
    mywidget2.cpp

HEADERS  += mywidget.h \
    mywidget2.h

2)窗口1的头文件:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include<QPushButton>
#include"mywidget2.h"           //为了在本类显示窗口2

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget(QWidget *parent = 0);
    ~MyWidget();

    void mySolt();      //主窗口的槽函数
    void dealSelfSolt();//处理自定义信号的槽函数

private:
    QPushButton b1;     //按钮1
    MyWidget2   w2;     //窗口2  为了在本类显示窗口2
};

#endif // MYWIDGET_H

3)窗口2的头文件:

扫描二维码关注公众号,回复: 11125079 查看本文章
#ifndef MYWIDGET2_H
#define MYWIDGET2_H

#include <QWidget>
#include<QPushButton>

class MyWidget2 : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget2(QWidget *parent = 0);
    void sendSignal();      //发送信号的槽函数

private:
    QPushButton b2;         //按钮2
    
    /*
    自定义信号的注意事项:
    1)必须要有signals关键字声明。
    2)信号没有返回值,但是可以有参数。
    3)信号就是函数的声明,无须定义。
    4)使用方法:用emit mySignal();来使用。
    */
signals:
    void mySignal();        //自定义信号 利用按下按钮 然后触发该信号发送给主窗口接收 处理相应工作

    
public slots:
};

#endif // MYWIDGET2_H

4)窗口1的.cpp文件

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
{
    resize(300,400);                      //设定窗口大小

    b1.setParent(this);                   //若注释掉则不会显示该按钮
    b1.setText("切换到子窗口");
    this->setWindowTitle("大哥");         //主题当前窗口设置

    connect(&b1,&QPushButton::clicked,this,&MyWidget::mySolt);       //实现隐藏1显示2
    connect(&w2,&MyWidget2::mySignal,this,&MyWidget::dealSelfSolt);  //实现隐藏2显示1


    w2.show();                           //显示窗口2
}

//普通函数做槽函数麻烦 因为很难调用成员变量 最后我还是使用成员函数做槽函数
void MyWidget::mySolt()
{
    //当前窗口隐藏 子窗口显示
    this->hide();
    w2.show();
}

//处理自定义信号的槽函数
void MyWidget::dealSelfSolt()
{
    //窗口2隐藏 窗口1显示
    w2.hide();
    this->show();
}

MyWidget::~MyWidget()
{

}

5)窗口2 .cpp文件:

#include "mywidget2.h"

MyWidget2::MyWidget2(QWidget *parent) : QWidget(parent)
{
    resize(300,400);                     //设定窗口大小

    b2.setParent(this);
    b2.setText("切换到主窗口");            //但创建完该窗口后 该窗口还没显示 需要本类对象最为主窗口的成员 然后显示
    this->setWindowTitle("小弟");        //主题当前窗口设置

    connect(&b2,&QPushButton::clicked,this,&MyWidget2::sendSignal);   //按钮按下就发送自定义信号
}

//按下按钮触发该槽函数 发送自定义信号
void MyWidget2::sendSignal()
{
    emit mySignal();
}

6)主函数:

#include "mywidget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();

    return a.exec();
}

总结该例子:不难,就是自定义的槽函数多了点,按照上面步骤来,基本不会出错。

发布了54 篇原创文章 · 获赞 1 · 访问量 691

猜你喜欢

转载自blog.csdn.net/weixin_44517656/article/details/105677230