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,"我是子窗口");
}

猜你喜欢

转载自www.cnblogs.com/cthon/p/9613515.html