zoukankan      html  css  js  c++  java
  • QT中信号与槽的常见使用

    一.标准信号与槽函数

    有些信号和槽的函数模板都已经被写好了,只需要调用即可

    下面是一个点击按钮关闭窗口的程序

    .h文件

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>
    #include <QPushButton>
    
    class MyWidget : public QWidget
    {
        Q_OBJECT    //使用信号与槽的时候需要用到它
    
    public:
        MyWidget(QWidget *parent = 0);
        ~MyWidget();
    
    public:
        QPushButton* pBtn1;
    
    };
    
    #endif // MYWIDGET_H

    .cpp文件

    #include "mywidget.h"
    
    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的
        pBtn1->setText("Close");//创建一个关闭窗口的按钮
        pBtn1->move(100,100);   //更改按钮在窗口上的位置
    
        //标准信号与槽函数的使用
        connect(pBtn1, &QPushButton::pressed, this, &MyWidget::close);
        /*pBtn1:信号发出者,为指针类型
         *&QPushButton::pressed 信号函数;  &发送者的类名:信号名字
         *this:信号的接收者
         *&Widget::close 槽函数,信号处理函数; &接受的类名::槽函数名称
         */
    
    }
    
    MyWidget::~MyWidget()
    {
    
    }

    二.自定义槽函数

    .h文件

    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>
    #include <QPushButton>
    
    class MyWidget : public QWidget
    {
        Q_OBJECT    //使用信号与槽的时候需要用到它
    
    public:
        MyWidget(QWidget *parent = 0);
        ~MyWidget();
    
    public:
        QPushButton* pBtn1;
    
    public:
        //自定义的槽函数
        void mySlot();
    
    };
    
    #endif // MYWIDGET_H

    .cpp文件

    #include "mywidget.h"
    
    
    MyWidget::MyWidget(QWidget *parent)
        : QWidget(parent)
    {
        pBtn1 = new QPushButton(this); //指定父对象,不然按钮在窗口上是无法正常显示的
        pBtn1->setText("Close");//创建一个关闭窗口的按钮
        pBtn1->move(100,100);   //更改按钮在窗口上的位置
    
        connect(pBtn1, &QPushButton::pressed, this, mySlot);
        /*自定义槽函数:
         * QT5:任意的成员函数,普通的全局函数,静态函数
         * 由于信号函数是没有返回值的,所以槽函数一定也没有返回值
         * 一般在QT5中都是使用成员函数作为槽函数
         */
    }
    
    
    //成员函数
    void MyWidget::mySlot()
    {
        this->close();
    }
    
    MyWidget::~MyWidget()
    {
    
    }

    三.自定义信号与槽函数

    下面是一个两个窗口相互切换的程序,点击主窗口按钮,切换到子窗口;在子窗口中点击按钮,给主窗口发送自定义信号。

    mainwidget.h文件

    #ifndef MAINWIDGET_H
    #define MAINWIDGET_H
    
    #include <QWidget>
    #include <QPushButton>
    #include "subwidget.h"
    
    class MainWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        MainWidget(QWidget *parent = 0);
        ~MainWidget();
    
    public:
        QPushButton* pBtn1;
        SubWidget subWidget;
    
    public:
        void ShowSubWidget();
        void DealSub();
        void DealSubWin(int, QString);
    
    };
    
    #endif // MAINWIDGET_H

    mainwidget.cpp文件

    #include "mainwidget.h"
    #include <QDebug>
    
    MainWidget::MainWidget(QWidget *parent)
        : QWidget(parent)
    {
        this->setWindowTitle("主窗口");
    
        pBtn1 = new QPushButton("切换到子窗口", this);
        pBtn1->move(100, 100);
    
        //点击按钮,显示子窗口
        connect(pBtn1, &QPushButton::pressed, this, ShowSubWidget);
    
        //处理子窗口发送的信号
    
        //不带参数的信号
        void(SubWidget::*funSignal)() = &SubWidget::mySignal;
        connect(&subWidget, funSignal, this, DealSub);
    
        //带有参数的信号
        void(SubWidget::*TestSignal)(int, QString) = &SubWidget::mySignal;
        connect(&subWidget, TestSignal, this, DealSubWin);
    
    
    }
    
    MainWidget::~MainWidget()
    {
    
    }
    
    void MainWidget::ShowSubWidget()
    {
        subWidget.show();
    }
    
    void MainWidget::DealSub()
    {
        subWidget.hide();
        this->show();
    }
    
    void MainWidget::DealSubWin(int a, QString str)
    {
        qDebug() << a;
        qDebug() << str.toUtf8().data();
    }

    subwidget.h文件

    #ifndef SUBWIDGET_H
    #define SUBWIDGET_H
    
    #include <QWidget>
    #include <QPushButton>
    
    class SubWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit SubWidget(QWidget *parent = 0);
    
    signals:
        //自定义信号
        /*信号没有返回值,但可以有参数
         * 信号就是函数的声明,只需要声明,无需定义
         * 使用emit mySignal
         * 信号可以重载
         */
        void mySignal(); //无参数的信号
        void mySignal(int, QString); //有参数的信号
    
    public slots:
    
    public:
        QPushButton* pBtn;
    
    public:
        //自定义槽函数
        void sendSlot();
    
    };
    
    #endif // SUBWIDGET_H

    subwidget.cpp文件

    #include "subwidget.h"
    
    SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
    {
        this->setWindowTitle("子窗口");
    
        pBtn = new QPushButton("切换到主窗口", this);
        pBtn->move(100, 100);
    
        connect(pBtn, &QPushButton::clicked, this, sendSlot);
    }
    
    void SubWidget::sendSlot()
    {
        //当按钮按下时,子窗口向主窗口发送信号
        emit mySignal();
        emit mySignal(100, "我是子窗口");
    }
  • 相关阅读:
    WMware下的Linux系统安装VMtools
    VMware虚拟机安装Ubuntu图文攻略
    Python高级编程(三)
    Python高级编程(二)
    Python高级编程(一)
    纯div+css样式弹出泡泡消息框
    EF应用CodeFirst模式,数据迁移的基本用法要点摘记
    sql左连接的误区
    ExtJs,从开始接触到如今,我都觉得你好垃圾阿。。。。
    EntityFramework经典的left join语法
  • 原文地址:https://www.cnblogs.com/QingYiShouJiuRen/p/11442060.html
Copyright © 2011-2022 走看看