zoukankan      html  css  js  c++  java
  • QT(4)信号与槽

    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();
        //Qt4信号连接
        //QT4槽函数必须有slots关键字来修饰
    //public slots:
        //槽没有返回值,因为槽和信号是对应的,信号没有返回值
        void mySlot();
        void changeWin();
        void dealSub();
        void dealSlot(int,QString);
    
    private:
        QPushButton b1;
        QPushButton *b2;
        QPushButton b3;
    
        subWidget subw;
    
    
    };
    
    #endif // MAINWIDGET_H

    subWidget.h

    #ifndef SUBWIDGET_H
    #define SUBWIDGET_H
    
    #include <QWidget>
    #include <QPushButton>
    
    class subWidget : public QWidget
    {
        Q_OBJECT
    public:
        explicit subWidget(QWidget *parent = nullptr);
    
        void sendSlot();
    signals:
        /* 信号必须有signals关键字来声明
         * 信号没有返回值,但可以有参数
         * 信号就是函数的声明,只需声明,无需定义
         * 使用:emit mySignal();
         * 信号可以重载
         */
        void mySignal();
        void mySignal(int,QString);
    
    public slots:
    
    private:
        QPushButton b;
    };
    
    #endif // SUBWIDGET_H

    main.cpp

    /*信号与槽:QT对象之间通信的接口
     */
    
    #include "mainwidget.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        mainWidget w;//执行mainwidget的构造函数
        w.show();
    
        return a.exec();
    }

    mainWidget.cpp

    #include "mainwidget.h"
    #include <QDebug> //打印
    
    mainWidget::mainWidget(QWidget *parent)
        : QWidget(parent)
    {
        b1.setParent(this);
        b1.setText("close");
        b1.move(100,100);
    
        b2 = new QPushButton(this);
        b2->setText("hide");
    
        connect(&b1,&QPushButton::pressed,this,&mainWidget::close);
        /* &b1:信号发出者,指针类型
         * &QPushButton::pressed:处理的信号,     &发送者的类名::信号的名字
         * this:信号接收者
         * &mainWidget::close : 槽函数,信号处理函数      &接收者的类名::槽函数的名字
         */
    
        /* 自定义槽,普通函数的用法
         * Qt5:任意的成员函数,普通全局函数,静态函数
         * 槽函数需要和信号一直(参数,返回值)
         * 由于信号都是没有返回值,所以,槽函数一定没有返回值
         */
    
        connect(b2,&QPushButton::released,this,&mainWidget::mySlot);
    
        connect(b2,&QPushButton::released,&b1,&QPushButton::hide);
    
        /* 信号:短信
         * 槽函数:接收短信的手机
         */
    
        setWindowTitle("老大");//等价于this->setWindowTitle("老大");
        b3.setParent(this);
        b3.setText("切换到子窗口");
        b3.move(50,50);
    
        //显示子窗口
        //w.show();
    
        connect(&b3,&QPushButton::released,this,&mainWidget::changeWin);
        //处理子窗口的信号
    
        //Qt5信号连接
        void (subWidget::*funSignal)() = &subWidget::mySignal;
        connect(&subw,funSignal,this,&mainWidget::dealSub);
        void (subWidget::*testSignal)(int,QString) = &subWidget::mySignal;
        connect(&subw,testSignal,this,&mainWidget::dealSlot);
    
        //Qt4信号连接
        //QT4槽函数必须有slots关键字来修饰
        //connect(&subw, SIGNAL(mySignal()),this,SLOT(dealSub()));
        //connect(&subw, SIGNAL(mySignal(int QString)),this,SLOT(dealSlot(int,QString)));
        //SIGNAL SLOT 将函数名字 -> 字符串,不进行错误检查
        resize(300,400);
    
    }
    void mainWidget::dealSlot(int a, QString str)
    {
        // str.toUtf8() -> 字节数组QByteArray
        // ...data() -> QByteArray -> char*
        qDebug() << a << str.toUtf8().data();
    }
    
    void mainWidget::changeWin()
    {
        //子窗口显示
        subw.show();
        //本窗口隐藏
        this->hide();
    }
    
    void mainWidget::dealSub()
    {
        //子窗口隐藏
        subw.hide();
        //本窗口显示
        this->show();
    
    }
    
    void mainWidget::mySlot()
    {
        b2->setText("666");
        setWindowTitle("niha");
    }
    
    mainWidget::~mainWidget()
    {
    
    }

    subWidget.cpp

    #include "subwidget.h"
    
    subWidget::subWidget(QWidget *parent) : QWidget(parent)
    {
        this->setWindowTitle("小弟");
        b.setParent(this);
        b.setText("切换到主窗口");
    
        connect(&b,&QPushButton::clicked,this,&subWidget::sendSlot);
        resize(300,400);
    }
    
    void subWidget::sendSlot()
    {
        emit mySignal();
        emit mySignal(250,"我是子窗口");
    }
  • 相关阅读:
    [ARC117F]Gateau
    [ARC117D]Miracle Tree
    [loj3504]支配
    [gym102511K]Traffic Blights
    [loj3501]图函数
    [loj3503]滚榜
    [loj3500]矩阵游戏
    [loj2135]幻想乡战略游戏
    [cf720D]Slalom
    [cf1349E]Slime and Hats
  • 原文地址:https://www.cnblogs.com/cthon/p/9613515.html
Copyright © 2011-2022 走看看