1. 程式人生 > >初始QT 3 -------- 訊號、槽、Lamda表示式

初始QT 3 -------- 訊號、槽、Lamda表示式

新建兩個類:MyWidget,NewWidget

檔案MyWidget.cpp內容為:

#include "mywidget.h"

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
    // QPushButton b1("b1", this);
    // 記憶體管理,當物件被釋放的時候,會將它的所有子物件都釋放掉
    QPushButton *b1 = new QPushButton("b1", this);   //只能用new的方式
    QPushButton *b2 = new QPushButton("b2", this);

    b3 = new QPushButton("b3", this);
    b4 = new QPushButton("b4", this);
    b5 = new QPushButton("b5", this);
    b3->move(200,200);
    b4->move(200,0);
    b1->move(100,100);

    b5->move(0,100);


    // Qt4的寫法,用 SINGNAL  和 SLOT巨集
    connect(b1, SIGNAL(clicked()), this, SLOT(close()));

    // Qt5的寫法
    // 1、訊號的傳送者
    // 2、傳送的訊號:      &傳送者型別::傳送的訊號
    // 3、接收者
    // 4、接收者的處理函式: &接收者型別::處理函式
    connect(b2, &QPushButton::clicked, this, &MyWidget::close);

    // 自定義槽函式
    // 1、自定義槽函式放在 slots 關鍵字下
    // 2、槽函式返回值型別為 void
    // 3、槽函式的引數要訊號函式保持一致
    connect(b3, SIGNAL(clicked()), this, SLOT(handleClicked()));


    connect(b5, SIGNAL(clicked()), this, SLOT(newWidget()));

    // 自定義訊號
    // 1、自定義訊號函式放在 signals 關鍵字下
    // 2、訊號函式返回值是void ,函式只有宣告,不需要實現
    // 3、訊號發射: 用 emit 關鍵字
    connect(&nw, SIGNAL(sendSigNal()), this, SLOT(reShow()));

    // Lamda表示式 C++11 的特性 ----->  匿名函式
    QPushButton *b6 = new QPushButton("b6", this);
    b6->move(100, 300);

    // connect 使用Lamda表示式必須使用qt5的方式
    // 1、匿名函式不是類的成員函式,匿名函式和外部是不通的,不能使用外部的變數
    // 2、外部的可以傳給匿名函式
    /*常用的引數:
     * [=]: 外部資料以值傳遞的形式傳入到匿名函式內部
     * [&]: 外部資料以引用形式傳入到匿名函式內部
     *
     * 比較常用的形式:
     * [this] : 將this指標傳遞到匿名函式匿名 ----> 在匿名函式內部可以使用this指標
    */
    connect(b6, &QPushButton::clicked,
            [this]()
            {
                static int i = 0;
                if (i++ % 2 == 0)
                    b3->setText("123");  // this->b3->setText("123");
                else
                    b3->setText("abc");  // this->b3->setText("abc");
            });



}

void MyWidget::handleClicked()
{
    static int i = 0;
    if (i++ % 2 == 0)
        b4->setText("123");
    else
        b4->setText("abc");

    int x = b4->x();
    int y = b4->y();

    x += 50;
    if (x > this->width())
    {
        y += 150;
        x = 0;
    }

    if (y > this->height())
    {
        y = 0;
    }

    b4->move(x, y);
}

void MyWidget::newWidget()
{
    nw.show();

    this->hide();  // 當前視窗隱藏
}

void MyWidget::reShow()
{
    nw.hide();

    this->show();
}

檔案MyWidget.h內容為:

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QPushButton>
#include "newwidget.h"
class MyWidget : public QWidget
{
    Q_OBJECT
public:
    explicit MyWidget(QWidget *parent = 0);



signals:

public slots:                //自定義的槽
    void handleClicked();

    void newWidget();

    void reShow();

private:
    QPushButton *b3;
    QPushButton *b4;
    QPushButton *b5;

    NewWidget nw;
};

#endif // MYWIDGET_H

檔案NewWidget.cpp中的內容為:

#include "newwidget.h"

NewWidget::NewWidget(QWidget *parent) : QWidget(parent)
{
    QPushButton *b = new QPushButton("new", this);

    connect(b, SIGNAL(clicked()), this, SLOT(handleClicked()));

    resize(400,400);
}


void NewWidget::handleClicked()
{
    emit sendSigNal();   //傳送訊號用emit關鍵字
}

檔案NewWidget.h中的內容為:

#ifndef NEWWIDGET_H
#define NEWWIDGET_H

#include <QWidget>
#include <QPushButton>
class NewWidget : public QWidget
{
    Q_OBJECT
public:
    explicit NewWidget(QWidget *parent = 0);

signals:                   //自定義的訊號
    void sendSigNal();

public slots:

    void handleClicked();
};

#endif // NEWWIDGET_H

相關推薦

初始QT 3 -------- 訊號Lamda表示式

新建兩個類:MyWidget,NewWidget 檔案MyWidget.cpp內容為: #include "mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { // QPushB

Qt訊號函式的3種對映方法

在Qt Creater中提供了三種建立訊號和槽的方法,詳細介紹如下: 實現功能:點選OK按鈕,TextLabel顯示“Hello World” 詳細過程: 首先,執行Qt Creater,建立Qt Gui application工程。 其次,在點選.ui檔案,在控制元件欄

QT---之訊號的關聯與語法

一概述  二訊號  四訊號和槽的關聯  五元物件工具  六程式樣例  七應注意的問題  8訊號和槽也不能攜帶模板類引數  9巢狀的類不能位於訊號或槽區域內也不能有訊號或槽 

QT使用訊號注意事項

QT使用訊號與槽注意事項 如需轉載請標明出處:http://blog.csdn.net/itas109 QQ技術交流群:129518033 目錄 文章目錄 QT使用訊號與槽注意事項 @[toc] 前言

Qt學習之路_3(VS下Qt訊號初次體驗)

在Qt中是使用訊號與槽的機制來完成事件的響應過程的。網上Qt的開發基於Qt Creator的資料比較多,基於vs下的資料除了其環境配置方面的外就剩下很少了。開始以為2者環境下的開發方式相同,後面稍微接觸了下發現還是有微妙的區別的,Qt在vs下畢竟是add-in嵌入的,用起

Qt訊號的工作機制

void QMetaObject::activate(QObject *sender, const QMetaObject *m, int local_signal_index, void **argv) { activate(sender, QM

C++ ——Qt訊號的詳解

1、概述 訊號槽是 Qt 框架引以為豪的機制之一。所謂訊號槽,實際就是觀察者模式。當某個事件發生之後,比如,按鈕檢測到自己被點選了一下,它就會發出一個訊號(signal)。這種發出是沒有目的的,類似廣播。如果有物件對這個訊號感興趣,它就會使用連線(connect)函式,

Qt訊號對值傳遞引數和引用傳遞引數的總結

在同一個執行緒中 當訊號和槽都在同一個執行緒中時,值傳遞引數和引用傳遞引數有區別: 值傳遞會複製物件;(測試時,列印傳遞前後的地址不同) 引用傳遞不會複製物件;(測試時,列印傳遞前後的地址相同)

Qt訊號你可能不知道的那些

說到訊號與槽,這是Qt獨有的特點。 1、應該知道的: 一般用訊號和槽都會用到:signals和slots Qt4用法:     connect(sender, SIGNAL(signal), rece

Qt訊號(純乾貨)

       接觸Qt斷斷續續有些時間了,總看了一堆的文章說訊號槽的概念,心裡就想罵人,做為一個初學者,最重要的就是怎麼寫程式碼,寫程式碼寫多了,再去看理論,有時水到渠成的就明白那些理論了。但所有講訊號槽的都把一堆訊號槽的好處說一通,把MFC的訊息機制貶一通。具體程式碼

QT學習day02---圖形介面對話方塊訊號

一、QT圖形介面 ①QT座標軸 起點:左上角 X:橫軸 Y:縱軸 ②QWidget、QDialog、QMainWindow的異同點 QWidget:視窗為空,什麼內容都沒有 QMainWindow:含有選單欄,狀態列,工具欄等…已經包含了QWidget QDialog:對話方塊(

深入理解Qt訊號機制訊號中的Lambda表示式

對於事件處理,MFC中使用的是訊息對映機制,Qt使用的是訊號和槽機制,在我看來,Qt的訊號和槽比MFC功能更強大,也更靈活。1、訊號和槽的簡單介紹: 一般格式: connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));

QT入門(一)Qt工程簡介訊號初步練習

QT程式結構 程式特點 跟普通程式一樣,標頭檔案,原始檔,工程檔案.pro 標頭檔案特點 QT系統標頭檔案沒有.h 標頭檔案和類名一樣 命名Q開頭,前兩個字母大寫 工程檔案.Pro的相關介紹 # 模組 QT += core gui # 高於4版

LoRa關鍵引數 1擴頻因子(SF) 2編位元速率(CR) 3訊號頻寬(BW) 4LoRa訊號頻寬BW符號速率Rs和資料速率DR的關係

 LoRa學習:LoRa關鍵引數(擴頻因子,編位元速率,頻寬)的設定及解釋 1、擴頻因子(SF) 2、編位元速率(CR) 3、訊號頻寬(BW) 4、LoRa訊號頻寬BW、符號速率Rs和資料速率DR的關係 5、 LoRa訊號頻寬、擴頻

spark1.6轉到spark2.3總結(依賴版本初始化問題)

問題:pom裡面不寫spark版本(<spark.version>2.0.0</spark.version>)的話,可能會預設用spark1.6導致版本衝突異常——語法通過但無法編譯執行 問題(spark版本必須對應Scala版本):參考https:/

有四個執行緒1234,執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推......... 現在有四個檔案A B C D,初始都為空。現要讓四個檔案呈如下格式:A:1 2 3 4 1 2..

具體題目如下: 有四個執行緒1、2、3、4, 執行緒1的功能就是輸出1,執行緒2的功能就是輸出2, 以此類推.........  現在有四個檔案A B C D, 初始都為空。現要讓四個檔案呈如下格式: A:1 2 3 4 1 2.... B:2 3 4 1 2 3....

Qt入門之基礎篇 ( 二 ) :Qt項目建立編譯運行和發布過程解析

qt 5 對話 讓我 進度 qmake ctr deploy 設定 設置 轉載請註明出處:CN_Simo。 題解:   本篇內容主講Qt應用從創建到發布的整個過程,旨在幫助讀者能夠快速走進Qt的世界。   本來計劃是講解Qt源碼靜態編譯,如此的話讀者可能並不能清楚地知

初始化的數值(intdouble等)(一)

ng- private pub num 構造 ext signed 代碼 模板 首先考慮一個具有幾個構造函數的MyClass類。如果我們決定在這個類的私有部分加入一個新的數據成員,稱為int_data_: class MyClass { public: MyClas

SpringMVC案例3----spring3.0項目攔截器ajax文件上傳應用

his water aop pro 文件夾 創建 adapt 後綴 實現 依然是項目結構圖和所需jar包圖: 顯示配置文件hib-config.xml <?xml version="1.0" encoding=&qu

Charles Proxy v4.1.3 MacWin64Win32破解版

app lib 下載 裏的 windows java https contents tar 1. 下載Charles Proxy 4.1.3版本,百度雲盤下載 或 去官網下載 2. 安裝後先打開Charles一次(Windows版可以忽略此步驟) 3. 在這個網站(http