Qt自定義類型

概述

在使用Qt創建用戶界面時,特別是那些具有特殊控件和特性的界面時,開發人員有時需要創建新的數據類型,以便與Qt現有的值類型集一起使用或代替它們。

QSize、QColor和QString等標準類型都可以存儲在QVariant對象中,作為基于qobject的類的屬性類型,并在信號槽通信中發出。

在本文中,我們將使用一個自定義類型,并描述如何將其集成到Qt的對象模型中,以便它能夠以與標準Qt類型相同的方式存儲。然后,我們將展示如何注冊自定義類型以允許它在信號和插槽連接中使用。

創建自定義類型

在開始之前,我們需要確保創建的自定義類型滿足QMetaType的所有要求。換句話說,它必須提供:

  • 一個公共的默認構造函數,
  • 一個公共復制構造函數,以及
  • 一個公共析構函數。

下面的Message類定義包含了這些成員:

class Message
{
public:Message() = default;~Message() = default;Message(const Message &) = default;Message &operator=(const Message &) = default;Message(const QString &body, const QStringList &headers);QString body() const;QStringList headers() const;private:QString m_body;QStringList m_headers;
};

這個類還提供了一個普通使用的構造函數,以及兩個用于獲取私有數據的公共成員函數。

用QMetaType聲明類型

Message類只需要適當的實現就可以使用。然而,Qt的類型系統將無法理解如何存儲,檢索和序列化這個類的實例,如果沒有一些幫助。例如,我們將無法在QVariant中存儲消息值

Qt中負責自定義類型的類是QMetaType。為了讓這個類知道類型,我們在定義類的頭文件中調用Q_DECLARE_METATYPE()宏:

Q_DECLARE_METATYPE(Message);

這使得將消息值存儲在QVariant對象中并在以后檢索成為可能。有關演示這一點的代碼,請參閱自定義類型示例。

Q_DECLARE_METATYPE()宏也可以將這些值用作信號的參數,但只能在直接的信號槽連接中使用。為了使自定義類型通常可用于信號和插槽機制,我們需要執行一些額外的工作。

創建和銷毀自定義對象

雖然前一節中的聲明使該類型可用于直接的信號槽連接,但不能用于排隊的信號槽連接,例如不同線程中的對象之間的連接。這是因為元對象系統不知道如何在運行時處理自定義類型對象的創建和銷毀

要在運行時創建對象,請調用qRegisterMetaType()模板函數將其注冊到元對象系統。這也使得該類型可用于排隊信號槽通信,只要您在創建第一個使用該類型的連接之前調用它。

排隊的自定義類型示例聲明了一個注冊在main.cpp文件中的塊類:

int main(int argc, char *argv[])
{QApplication app(argc, argv);...qRegisterMetaType<Block>();...return app.exec();
}

此類型稍后在window.cpp文件中的信號槽連接中使用:

Window::Window(QWidget *parent): QWidget(parent), thread(new RenderThread(this))
{...connect(thread, &RenderThread::sendBlock,this, &Window::addBlock);...setWindowTitle(tr("Queued Custom Type"));
}

如果在未注冊的情況下在排隊連接中使用了類型,則將在控制臺中打印警告;例如:

QObject::connect: Cannot queue arguments of type 'Block'
(Make sure 'Block' is registered using qRegisterMetaType().)

使類型可打印

使自定義類型可打印用于調試通常是非常有用的,如下面的代碼所示:

    Message message(body, headers);qDebug() << "Original:" << message;

這可以通過為該類型創建一個流操作符來實現,該操作符通常在該類型的頭文件中定義:

QDebug operator<<(QDebug dbg, const Message &message);

自定義類型示例中Message類型的實現做了一些努力,使可打印的表示盡可能可讀:

QDebug operator<<(QDebug dbg, const Message &message)
{const QString body = message.body();QVector<QStringRef> pieces = body.splitRef(QLatin1String("\r\n"), Qt::SkipEmptyParts);if (pieces.isEmpty())dbg.nospace() << "Message()";else if (pieces.size() == 1)dbg.nospace() << "Message(" << pieces.first() << ")";elsedbg.nospace() << "Message(" << pieces.first() << " ...)";return dbg.maybeSpace();
}

當然,發送到調試流的輸出可以按照您的喜好設置為簡單或復雜。請注意,該函數返回的值是QDebug對象本身,盡管這通常是通過調用QDebug的maybeSpace()成員函數獲得的,該函數用空格字符填充流,使其更具可讀性。

Creating Custom Qt Types | Qt Core 5.15.17

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

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

相關文章

51單片機第6步_stdlib.h庫函數

本章重點學習stdlib.h庫函數。 #include <REG51.h> //包含頭文件REG51.h,使能51內部寄存器; #include <stdlib.h> //float atof (char *s1); //參數s1字符串可包含正負號,小數點或E(e)來表示指數部分,如123.456或123e-2; //若首字符是非數據字符,或為正負號…

es6語法復習一

es6語法 1.var 變量提升 2.let 不存在變量提升&#xff0c;只能定義一次 3.const 先定義再使用&#xff0c;定義好來不能修改 4.解構賦值 [a,b,c][1,2,3],{a,b,c}{a:1,b:2,c:3} 5.模版字符串 let aaa; ${a} is ok 6.對象簡化寫法 const school{ name, change, improve(){ cons…

力扣2438.二的冪數組中查詢范圍內的乘積

力扣2438.二的冪數組中查詢范圍內的乘積 lowbit求所有2的冪 accumulate函數(begin,end,start,way)求和/積的方式求積并取模 const int N 1e9 7;class Solution {public:int lowbit(int x){return x & -x;}vector<int> productQueries(int n, vector<vector&l…

[NSSCTF]-Reverse:[SWPUCTF 2021 新生賽]easyapp(安卓逆向,異或)

無殼 把后綴名改為zip&#xff0c;找到apk 查看jadx 這里調用了MainActivity的lambda$onCreate$0$MainActivity&#xff0c;然后又調用了Encoder進行異或。 exp&#xff1a; result棿棢棢棲棥棷棊棐棁棚棨棨棵棢棌 key987654321 flag for i in range(len(result)):flagchr(…

HarmonyOS開發:應用完整性校驗

簡介 為了確保應用的完整性和來源可靠&#xff0c;OpenHarmony需要對應用進行簽名和驗簽。 應用開發階段&#xff1a; 開發者完成開發并生成安裝包后&#xff0c;需要開發者對安裝包進行簽名&#xff0c;以證明安裝包發布到設備的過程中沒有被篡改。OpenHarmony的應用完整性校…

Foxit Reader與PDF交互性:探索高級功能

引言 PDF&#xff08;Portable Document Format&#xff09;文件格式以其跨平臺的一致性和豐富的多媒體支持而廣受歡迎。Foxit Reader作為一款功能全面的PDF閱讀器&#xff0c;不僅提供了基本的查看和導航功能&#xff0c;還支持PDF文件中的多種交互式元素。本文將深入探討Fox…

SQL Server中 MERGE 語句

在 SQL Server 中,MERGE 語句用于根據兩個表之間的條件來插入、更新或刪除記錄。它通常用于同步兩個表的數據,其中一個表是源表(包含要插入或更新的數據),另一個是目標表(數據要插入或更新的表)。 1、本文內容 語法參數備注觸發器的實現權限有關索引的最佳做法MERGE 的…

探索sklearn的貝葉斯奧秘:樸素貝葉斯分類器全解析

&#x1f680; 探索sklearn的貝葉斯奧秘&#xff1a;樸素貝葉斯分類器全解析 樸素貝葉斯分類器是一類基于貝葉斯定理的簡單概率分類器&#xff0c;它們在文本分類、垃圾郵件識別等領域表現出色。在Python的sklearn庫中&#xff0c;樸素貝葉斯分類器以其實現簡單和效率高效而受…

關于響應式編程的理解與SpringCloudGateway的理解

關于響應式編程的理解與SpringCloudGateway的理解 一. 響應式編程與函數式編程的區別二. 響應式編程中常用的組件2.1 RxJava定義2.2 Rxjava基本概念2.3 RxJava 用法 三 SpringcloudGateway四 常見的四種限流規則 一. 響應式編程與函數式編程的區別 總的來說&#xff0c;響應式編…

qt中的枚舉值-QMetaEnum

QMetaEnum 測試代碼hcpp 講解 測試代碼 h #include <QMainWindow> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr);~M…

GPIO和PIN

文章目錄 1 GPIO和Pin1.1 GPIO和Pin基礎概念1.2 GPIO輸入模式1.3 GPIO輸出模式1.4 GPIO的HAL庫1.4.1 一些HAL庫表示1.4.2 HAL庫常用GPIO函數1.4.3 GPIO點亮led燈程序例子 1 GPIO和Pin 1.1 GPIO和Pin基礎概念 ? 單片機有很多的引腳&#xff0c;為了操控每一個引腳&#xff0c…

grpc學習golang版( 四、多服務示例 )

系列文章目錄 第一章 grpc基本概念與安裝 第二章 grpc入門示例 第三章 proto文件數據類型 第四章 多服務示例 第五章 多proto文件示例 第六章 服務器流式傳輸 第七章 客戶端流式傳輸 第八章 雙向流示例 文章目錄 一、前言二、定義proto文件三、編寫server服務端四、編寫Client客…

MySQL之可擴展性(九)

可擴展性 直接連接 2.修改應用的配置 還有一個分發負載的辦法是重新配置應用。例如&#xff0c;你可以配置多個機器來分擔生成大報表操作的負載。每臺機器可以配置成連接到不同的MySQL備庫&#xff0c;并為第N個用戶或網站生成報表。 這樣的系統很容易實現&#xff0c;但如果…

使用Python自動化收集和處理視頻資源的教程

在這篇教程中&#xff0c;我們將介紹如何利用Python腳本自動化收集和處理視頻資源。這篇文章將幫助您掌握基本的網絡自動化技術&#xff0c;并使用相關庫進行視頻資源的獲取和保存。以下是具體的實現步驟和代碼示例。 環境準備 在開始之前&#xff0c;請確保您的工作環境中已…

數據庫基礎教程

數據庫基礎教程 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;在本文中&#xff0c;我們將深入探討數據庫的基礎知識和操作&#xff0c;幫助您建立起扎實的數據…

Spring Boot集成jasypt快速入門Demo

1.什么是Jasypt&#xff1f; Jasypt&#xff08;Java Simplified Encryption&#xff09;是一個專注于簡化Java加密操作的工具。 它提供了一種簡單而強大的方式來處理數據的加密和解密&#xff0c;使開發者能夠輕松地保護應用程序中的敏感信息&#xff0c;如數據庫密碼、API密…

stl的map和set

概念 map和set底層都是紅黑樹 set是key模型結構&#xff0c;本質就是看一個元素在不在容器中。 map是key/value結構&#xff0c;里面存了一個pair結構&#xff0c;可以通過一個值來查找另外一個值 map和set結構中遍歷出來的都是有序并且去重了的&#xff0c;map和set都支持增…

Java高級重點知識點-17-異常

文章目錄 異常異常處理自定義異常 異常 指的是程序在執行過程中&#xff0c;出現的非正常的情況&#xff0c;最終會導致JVM的非正常停止。Java處 理異常的方式是中斷處理。 異常體系 異常的根類是 java.lang.Throwable&#xff0c;&#xff0c;其下有兩個子類&#xff1a;ja…

【QT】概述|對象樹模型|兩種控件模式|信號和槽|lambda

目錄 什么是QT 特點 QT程序 main函數 QT按鈕 純代碼模式 圖形化模式 對象樹模型 信號和槽 連接與斷開 自動連接 斷開連接 信號的發射 lambda表達式 基本語法 捕獲列表 Lambda表達式用于信號與槽的連接 例如 什么是QT Qt是一個跨平臺的C圖形用戶界面應用…

NeXT-Server 手動安裝

38 cd /home 使用 wget 下載你選擇的版本,https://go.dev/dl/ 找到適用于Linux的版本,你可以選擇 .tar.gz 格式的文件以用于Debian系統 39 wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz 40 tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz 42 echo ‘export PAT…