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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM