zoukankan      html  css  js  c++  java
  • 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();
    }

    效果:

  • 相关阅读:
    keepalived高可用+nginx证书代理
    dfs缩略图
    FastDFS分布式图片服务器搭建
    red5视频播放服务器
    压力测试操作流程
    mysql主从库配置读写分离以及备份
    jdk环境
    mysql主从库配置读写分离以及备份
    mysql5.7.26安装
    数据库异地备份(脚本)
  • 原文地址:https://www.cnblogs.com/chechen/p/11768362.html
Copyright © 2011-2022 走看看