天天看點

QT中的信号與槽1 建立一個關閉按鈕2 按鈕常用的信号3 自定義的槽函數4 自定義的信号信号和槽的注意事項Lambda表達式在槽中的用法

1 建立一個關閉按鈕

connect函數的最常用的一般形式:

connect(sender,signal,receiver,slot);

sender:發出信号的對象

siganl:發送對象發出的信号

receiver:接受信号的對象

slot:接收對象在接受到信号後所需要調用的函數(槽函數)

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //建立一個按鈕 點選關閉按鈕
    //this->close();
    QPushButton *p = new QPushButton("關閉視窗",this);
    //設定點選按鈕,會調用視窗的close函數
    connect(p,&QPushButton::clicked,this,&QWidget::close);
}
           

其中的close使用的是this這個接受類下的槽函數。

2 按鈕常用的信号

常用的信号可以在幫助文檔中檢視到。QPushButton的幫助文檔中并無Signal選項,但是在QPushButton繼承的類中,會出現QAbstractButton這個選項,裡面是有Signals的。

QT中的信号與槽1 建立一個關閉按鈕2 按鈕常用的信号3 自定義的槽函數4 自定義的信号信号和槽的注意事項Lambda表達式在槽中的用法

3 自定義的槽函數

.cpp檔案中:

#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)    : QWidget(parent)
{    
	button = new QPushButton;    
	button->setParent(this);    
	button->setText("列印呵呵");    
//注冊信号與槽的連結    
//槽函數可以使普通的成員函數,還可以是槽函數    
//注意:如果信号沒有參數,那麼槽函數也不能有參數,如果信号有參數,
//      那麼槽函數中可以有參數也可以沒有                                                                                             		  
	connect(button,&QPushButton::clicked,this,&Widget::print);
}                                                                              
void Widget::print()
{    
 		qDebug()<<"呵呵";
}
Widget::~Widget()
{
}
           

.h檔案中

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
   QPushButton *button;
public slots:
   void print();//注意這個函數中是否有參數取決于信号的函數中是否有參數
};
#endif // WIDGET_H
           

4 自定義的信号

這裡自定義信号以一個例子為原型,進行解釋。

大體實作的結果是:建立一個父視窗和一個子視窗,實作點選按鍵,可以分别隐藏對應的視窗。

下面是代碼實作:

父視窗:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include "son_widget.h"
#include <QPushButton>
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    Son_widget *sonwindow;
    QPushButton *button1;

public slots:
    void father_hide();
    void son_hide();

};
#endif // WIDGET_H
           

.cpp

#include "widget.h"
#include "son_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->setWindowTitle("father");
    this->sonwindow = new Son_widget;
    sonwindow->show();
    button1 = new QPushButton("hide father",this);
    connect(button1,&QPushButton::clicked,this,&Widget::father_hide);
    connect(sonwindow,&Son_widget::send_singnal,this,&Widget::son_hide);

}

void Widget::father_hide()
{
    this->hide();
    this->sonwindow->show();
}
void Widget::son_hide()
{
    this->show();
    this->sonwindow->hide();
}

Widget::~Widget()
{
}
           

下面是子視窗中的代碼

son_widget.h

#ifndef SON_WIDGET_H
#define SON_WIDGET_H

#include <QWidget>
#include <QPushButton>
class Son_widget : public QWidget
{
    Q_OBJECT
public:
    explicit Son_widget(QWidget *parent = nullptr);
    QPushButton *button2;

signals:
    //信号沒有傳回值,可以有參數,信号函數不需要定義,隻需要聲明
    void send_singnal(int a);
public slots:
    void hide_son_signal();
};


#endif // SON_WIDGET_H
           

.cpp

#include "son_widget.h"
#include <QPushButton>
#include <widget.h>

Son_widget::Son_widget(QWidget *parent) : QWidget(parent)
{
    this->setWindowTitle("son");
    button2 = new QPushButton("hide son",this);
    connect(button2,&QPushButton::clicked,this,&Son_widget::hide_son_signal);
}

void Son_widget::hide_son_signal()
{
    //點選按鈕的槽函數,發射信号
    emit send_singnal(10);
}
           

信号和槽的注意事項

  1. 發送者和接受者都是QObjict的子類(當槽函數是全局函數、Lambda表達式時不需要接受者時除外)
  2. 信号和槽的傳回值都是void
  3. 信号隻需要申明,不需要實作
  4. 槽函數需要申明也需要實作
  5. 使用emit在适當的地方發送信号
  6. 使用connect()函數連結信号與槽
  7. 信号和槽要求信号和槽的參數一緻

Lambda表達式在槽中的用法

例如:

1 槽函數可以是一個Lambda表達式

2 Lambda表達式中[]中寫的是=,代表将上面的函數中的局部變量以值傳遞的方式傳到Lambda表達式中

3 Lambda表達式中[]中寫的是&,代表将上面的函數中的局部變量以引用傳遞的方式傳到Lambda表達式中

4 Lambda表達式中[]中寫的是a,代表将上面的函數中的局部變量a以值傳遞的方式傳到Lambda表達式中

5 Lambda表達式中[]中寫的是a,b,代表将上面的函數中的局部變量a,b以值傳遞的方式傳到Lambda表達式中

6 Lambda表達式中[]中寫的是&a,代表将上面的函數中的局部變量a以引用傳遞的方式傳到Lambda表達式中

7 mutable代表可以再Lambda中修改傳入變量的值

8 ->int 代表Lambda表達式傳回的值是一個Int類型

Qt

繼續閱讀