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,"我是子窗口");
    }
  • 相关阅读:
    HDU1029 Ignatius and the Princess IV
    UVA11039 Building designing【排序】
    UVA11039 Building designing【排序】
    POJ3278 HDU2717 Catch That Cow
    POJ3278 HDU2717 Catch That Cow
    POJ1338 Ugly Numbers(解法二)
    POJ1338 Ugly Numbers(解法二)
    UVA532 Dungeon Master
    UVA532 Dungeon Master
    POJ1915 Knight Moves
  • 原文地址:https://www.cnblogs.com/cthon/p/9613515.html
Copyright © 2011-2022 走看看