QT——信號與槽/自定義信號與槽

1 信號與槽基本介紹

提出疑問,界面上已經有按鍵了,怎么操作才能讓用戶按下按鍵后有操作上的反應呢?

Qt 中,信號和槽機制是一種非常強大的事件通信機制。這是一個重要的概念,特別是對于初學者來說,理解它對于編寫 Qt 程序至關重要。

概要

1. 信號 (Signals):是由對象在特定事件發生時發出的消息。例如, QPushButton 有一個clicked() 信號,當用戶點擊按鈕時發出。

2. (Slots):是用來響應信號的方法。一個槽可以是任何函數,當其關聯的信號被發出時,該槽函數將被調用。

3. 連接信號和槽:使用 QObject::connect() 方法將信號連接到槽。當信號發出時,關聯的槽函數

會自動執行。

2 按鍵QPushButton設置信號與槽

在Qt中,信號與槽的連接有四種主要方法,每種方法都有其獨特的優點和適用場景。以下是對這四種方法的詳細介紹:

2.1?使用?QObject::connect

描述
這是最常用的方法,直接通過?QObject::connect?函數連接信號和槽。

示例

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

特點

  • 優點:簡單直接,適用于大多數情況。
  • 缺點:使用字符串指定信號和槽,缺乏編譯時類型檢查,可能導致運行時錯誤。

2.2?使用C++11 Lambda表達式

描述
利用C++11引入的Lambda表達式進行信號與槽的連接。這種方式可以直接在連接點使用匿名函數,使代碼更加簡潔。

示例

QObject::connect(sender, &Sender::signal, [=]() {/* lambda body */
});

特點

  • 優點:代碼簡潔,可以在連接點直接定義槽函數的行為,適合簡單的響應邏輯。
  • 缺點:復雜的Lambda表達式可能導致代碼可讀性下降。

2.3?使用函數指針

描述
Qt 5中引入,允許使用函數指針直接連接信號和槽,這種方式類型安全,且可以利用IDE的代碼補全和錯誤檢查。

示例

QObject::connect(sender, &Sender::signal, receiver, &Receiver::slot);

特點

  • 優點:類型安全,編譯時檢查信號和槽的匹配性,減少運行時錯誤。
  • 缺點:需要明確指定接收者對象和槽函數,靈活性稍低。

2.4?自動連接(使用UI文件)

描述
在使用Qt Designer時,可以通過命名約定自動連接信號和槽。當UI文件加載時,以?on_<objectName>_<signalName>?命名的槽會自動連接到相應的信號。

示例
在Qt Designer中命名按鈕為?pushButton,然后在代碼中定義:

void on_pushButton_clicked();

特點

  • 優點:簡化UI與邏輯的連接,適合快速開發。
  • 缺點:命名必須嚴格遵循約定,靈活性較低,不適合復雜邏輯。

總結

  • QObject::connect:適用于大多數情況,但缺乏類型安全。
  • Lambda表達式:適合簡單邏輯,代碼簡潔但可能影響可讀性。
  • 函數指針:類型安全,適合需要編譯時檢查的場景。
  • 自動連接:簡化UI與邏輯的連接,適合快速開發但靈活性較低。

根據具體需求選擇合適的連接方式,可以顯著提高開發效率和代碼質量。

完整示例如下:

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//在構造函數中進行信號與槽的綁定//第二種方式:QObject::connect(sender, SIGNAL(signal()), receiver,SLOT(slot()));QObject::connect(ui->btnCon, SIGNAL(clicked()), this,SLOT(on_btnCon_clickedMyself()));//第三方式:lambda表達式:QObject::connect(sender, &Sender::signal, [=]() { /*lambda body */ });
QObject::connect(ui->btnLambda, &QPushButton::clicked,[=](){std::cout << "btnLambdaClicked" << std::endl;
});
//第四種方式:QObject::connect(sender, &Sender::signal, receiver,
&Receiver::slot);
QObject::connect(ui->btnFortch,&QPushButton::clicked,this,&Widget::on_fortch_clicked);
}
Widget::~Widget()
{delete ui;
}
//第一種方式:通過uiDesigner
void Widget::on_btnui_clicked()
{std::cout << "UIBtnClicked" << std::endl;
}
void Widget::on_btnCon_clickedMyself()
{std::cout << "btnConClicked" << std::endl;
}
void Widget::on_fortch_clicked()
{std::cout << "btnForthClicked" << std::endl;
}

3 自定義信號與槽

Qt中,自定義信號與槽是實現對象間通信的一種機制。信號和槽是Qt對象通信的核心特性,使得一個對象能夠在發生某種事件時通知其他對象。自定義信號與槽的實現步驟如下:

3.1?定義信號

Qt中,信號是由 signals 關鍵字聲明的類成員函數。它們不需要實現,只需聲明。例如:

class MyClass : public QObject {Q_OBJECT
public:MyClass();
signals:void mySignal(int value);
};

在上面的例子中, MyClass 有一個名為 mySignal 的信號,它帶有一個整型參數。

3.2 定義槽

槽可以是任何普通的成員函數,但通常在類定義中用 slots 關鍵字標識。槽可以有返回類型,也可以接受參數,但它們的參數類型需要與發出信號的參數類型匹配。例如:

class MyClass : public QObject {Q_OBJECT
public slots:void mySlot(int value);
};

在這個例子中,我們定義了一個名為 mySlot 的槽,它接收一個整型參數。

3.3 連接信號與槽

使用 QObject::connect 函數將信號與槽連接起來。當信號被發射時,連接到這個信號的槽將被調用。

MyClass *myObject = new MyClass();
connect(myObject, SIGNAL(mySignal(int)), myObject, SLOT(mySlot(int)));

這行代碼連接了 myObject mySignal 信號到同一個對象的 mySlot 槽。

3.4 發射信號

使用 emit 關鍵字發射信號。當信號被發射時,所有連接到這個信號的槽都會被調用。

emit mySignal(123);

這將觸發所有連接到 mySignal 的槽。

自定義信號和槽是Qt編程中非常強大的特性,它們使得組件之間的通信變得靈活而松耦合。通過信和槽,可以方便地實現各種復雜的事件驅動邏輯。

完整示例如下:

//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <iostream>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{Q_OBJECT
public:Widget(QWidget *parent = nullptr);~Widget();
signals:void mysignal();void mysignalparams(int value);
private slots:void myslot();void myslotparams(int value);
private:Ui::Widget *ui;
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);connect(this,SIGNAL(mysignal()),this,SLOT(myslot()));connect(this,SIGNAL(mysignalparams(int)),this,SLOT(myslotparams(int)));emit mysignal();emit mysignalparams(100);
}
Widget::~Widget()
{delete ui;
}
void Widget::myslot()
{std::cout << "myslot" << std::endl;
}
void Widget::myslotparams(int value)
{qDebug() << "myslotparams";qDebug() << value ;
}

4 QDebug()

QDebug Qt 框架中用于輸出調試信息的一個類。它提供了一種方便的方式來輸出文本到標準輸出(通常是控制臺),這對于調試 Qt 應用程序非常有用。 QDebug 類可以與 Qt 的信號和槽機制一起使用,使得在響應各種事件時能夠輸出有用的調試信息。

使用 QDebug 的一個典型方式是通過 qDebug() 函數,它返回一個 QDebug 對象。然后,可以使用流操作符 << 來輸出各種數據類型。例如:

qDebug() << "This is a debug message";
int value = 10;
qDebug() << "The value is" << value;

當執行這些代碼時,它們會在應用程序的控制臺輸出相應的文本。這對于檢查程序的運行狀態、變量的值或者跟蹤程序的執行流程非常有幫助。

還可以使用 qDebug() 來輸出自定義類型,只要為這些類型提供了適當的輸出操作符重載。此外,Qt 還提供了 qInfo() , qWarning() , qCritical() qFatal() 函數,用于輸出不同級別的信息,分別用

于普通信息、警告、關鍵錯誤和致命錯誤。這有助于對日志信息進行級別劃分,從而更好地控制輸出內容。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/914897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/914897.shtml
英文地址,請注明出處:http://en.pswp.cn/news/914897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring原理揭秘--Spring的AOP

在這之前我們已經介紹了AOP的基本功能和概念&#xff0c;那么當AOP集成到spring則會發生改變。Spring AOP 中的Joinpoint&#xff1a;之前提高了很多Joinpoint的類型&#xff0c;但是在spring中則只會有方法級別的Joinpoint&#xff0c;像構造方法&#xff0c;字段的調用都沒適…

C++學習筆記五

C繼承//基類 class Animal{};//派生類 class Dog : public Animal{};#include<iostearm> using namespace std;//基類 class Shape{public:void setwidth(int w){width w;}void setheight(int h){height h;}protected:int width;int height;}//派生類 class Rectangle …

AndroidStudio環境搭建

一、AndroidStudio下載 正常百度出來的站會自動翻譯成中文&#xff0c;導致歷史版本的界面總是顯示不出可下載的地方&#xff0c;點擊成切回英文&#xff0c;就能看出了。 歷史版本&#xff1a;https://developer.android.google.cn/studio/archive

Java大廠面試實錄:從Spring Boot到AI大模型的深度技術拷問

場景&#xff1a;互聯網大廠Java后端面試 面試官&#xff08;嚴肅&#xff09;&#xff1a;小曾&#xff0c;請坐。今天主要考察Java后端技術棧&#xff0c;包括微服務、大數據、AI等。我們先從簡單問題開始。 小曾&#xff08;搓手&#xff09;&#xff1a;好嘞&#xff01;面…

深入解析Hadoop中的HDFS架構設計

HDFS概述與核心設計原則作為Hadoop生態系統的基石&#xff0c;HDFS&#xff08;Hadoop Distributed File System&#xff09;是一種專為大規模數據處理而設計的分布式文件系統。它的核心設計理念源于對互聯網時代數據特征的深刻洞察——數據規模呈指數級增長&#xff0c;而硬件…

ota之.加密算法,mcu加密方式

一、ota之.加密算法&#xff0c;mcu加密方式 前面一篇文章&#xff0c;講了soc的加密方式&#xff0c;但是soc資源充足&#xff0c;mcu沒有&#xff0c;所以不會用openss生成公私鑰 切計算哈希用rsa256位。 ECC&#xff08;橢圓曲線加密&#xff09; 是一種非對稱加密算法&…

LangChain面試內容整理-知識點23:實戰案例:檢索增強生成(RAG)系統

檢索增強生成(Retrieval-Augmented Generation, RAG)是一種將LLM與外部知識庫結合的方法,通過實時檢索相關信息來輔助生成答案。這極大緩解了LLM“封閉知識”過期或不足的問題。LangChain非常適合構建RAG系統,因為它提供了文檔加載、向量存儲、檢索接口、LLM組合的一站式方…

探索阿里云ESA:開啟邊緣安全加速新時代

阿里云 ESA 是什么&#xff1f;阿里云 ESA&#xff0c;全稱邊緣安全加速&#xff08;Edge Security Acceleration&#xff09; &#xff0c;其前身為全站加速 DCDN&#xff08;Dynamic Content Delivery Network&#xff09;。在 2024 年 9 月 30 日&#xff0c;阿里云完成了這…

醋酸鈰:賦能科技創新的稀土之力

一、什么是醋酸鈰醋酸鈰是鈰元素與醋酸根離子形成的化合物。鈰作為稀土元素中的重要一員&#xff0c;廣泛應用于材料科學、催化劑、電子產品等領域。醋酸鈰以無色結晶或淺黃色結晶的形式存在&#xff0c;是鈰的有機鹽之一。它不僅具有穩定的化學性質&#xff0c;而且在某些特定…

數據結構之普利姆算法

前言&#xff1a;Prim算法是圖論中的算法&#xff0c;用來生成圖的最小生成樹。本篇文章介紹算法的流程&#xff0c;實現思想&#xff0c;和具體代碼實現&#xff0c;使用c語言。學習需要輸出才能理解的更透徹&#xff0c;所以說堅持寫文章&#xff0c;希望可以用自己的方式把一…

構建強大的物聯網架構所需了解的一切

數據正驅動著當今的商業發展&#xff0c;而物聯網&#xff08;IoT&#xff09;則有助于為企業的增長和創新開辟新的機遇。麥肯錫的研究表明&#xff0c;全球數據在四年內實現了驚人的 7 倍增長。隨著越來越多的物聯網設備進入市場&#xff0c;更多企業開始需要強大的物聯網架構…

java之json轉excel生成

背景 業務為實現自定義樣式excel的導出&#xff0c;常規的做法就是根據數據在代碼中進行類似模版的配置&#xff1b;這樣的體驗不是很好&#xff0c;只要用戶改變下樣式的設置不用代碼改動就能實現自定義excel的導出更加靈活。 以下是具體實現 pom依賴 <dependency><g…

新版本Cursor中配置自定義MCP服務器教程,附MCP工具開發實戰源碼

在 Cursor 中配置自定義 MCP 服務器&#xff1a;打造你的 AI 開發工具鏈 引言 隨著 AI 編程助手的普及&#xff0c;開發者們越來越希望能夠定制化自己的開發環境。Cursor 作為一款強大的 AI 編程編輯器&#xff0c;提供了 Model Context Protocol (MCP) 支持&#xff0c;新版本…

前端面試十二之vue3基礎

一、ref和reactive在 Vue 3 中&#xff0c;ref 和 reactive 是兩種主要的響應式數據創建方式&#xff0c;它們各有特點和適用場景。1.refref 主要用于創建單個值的響應式引用&#xff0c;通常用于基本類型數據&#xff0c;如數字、字符串等。使用 ref 創建的引用對象可以通過 .…

設計模式四:裝飾模式(Decorator Pattern)

裝飾模式是一種結構型設計模式&#xff0c;它允許你動態地給一個對象添加額外的職責&#xff0c;相比繼承更加靈活。1. 模式定義裝飾模式&#xff1a;動態地給一個對象添加一些額外的職責。就增加功能來說&#xff0c;裝飾模式相比生成子類更為靈活。2. 模式結構主要角色&#…

神經網絡常見激活函數 14-Mish函數

文章目錄Mish函數導函數函數和導函數圖像優缺點PyTorch 中的 Mish 函數TensorFlow 中的 Mish 函數Mish 論文 https://arxiv.org/pdf/1908.08681 函數導函數 Mish函數 Mish(x)x?tanh??(softplus(x))x?tanh??(ln??(1ex))\begin{aligned} \text{Mish}(x) & x \cdot \t…

LAMP遷移LNMP Nginx多站點配置全流程

文章目錄前言備份與停止服務nginx安裝與配置nginx 編譯安裝配置服務php-fpm多站點配置phf-fpm介紹多站點配置nginx 多站點配置nginx ssl 配置參考前言 之前服務器使用的是 LAMP環境&#xff0c;想充分利用服務器資源&#xff0c;再運行另外一個站點 在LAMP環境下應該是也可以…

Nginx屏蔽國外IP訪問

下載IP列表 # 下載到文件 wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest # 直接輸出到終端 curl -sSL https://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest得到一份國內IP配置 # 原始IP列表格式&#xff1a;apnic|CN|ipv4|218.78.0.0|1310…

stl-string模擬

1.介紹主要進行cpp中string的模擬&#xff0c;方便我們更好的對stl進行使用&#xff0c;string沒有模板&#xff0c;我們將頭文件和函數寫在兩個不同的文件2.頭文件3.cpp文件如有問題&#xff0c;歡迎糾正&#xff01;

基于MATLAB的極限學習機ELM的數據回歸預測方法應用

說明&#xff1a;這是一個機器學習實戰項目&#xff08;附帶數據代碼文檔&#xff09;&#xff0c;如需數據代碼文檔可以直接到文章最后關注獲取 或者私信獲取。 1.項目背景 在當今的數據驅動時代&#xff0c;準確且高效的預測模型對于解決復雜問題至關重要。極限學習機&#…