QT IOC容器 使用教程 宣告式注入

2021-10-08 15:42:36 字數 3893 閱讀 2549

直接開搞,接著上一章沒說完的。之前xml配置檔案形式的注入一方面是實現了物件的構造和物件的使用相分離的理念,另一方面還將物件之間的關係配置移到了配置檔案中,這樣在實現乙個工具庫的時候可以使用它的配置能力極大程度提公升靈活性(可參考mclogqt)。而宣告式注入則去掉了配置檔案,直接在類的宣告時就指定了需要獲取哪乙個bean,這裡就直接對之前xml注入中的幾個類加入幾個宣告**即可。

首先在類r中加入mc_component("r"),將此類宣告為乙個元件,並指定beanname為"r"。

同樣的在類c中加入mc_component("c");然後加入一行新**mc_autowired("r", "r"),第乙個引數為類c中的屬性,第二個引數為容器中已經存在的beanname,即類r中mc_component("r")巨集指定的名字。如果容器中的beanname和物件中的屬性名一樣,比如現在這種情況,則可以直接使用mc_autowired(「r」)宣告即可。這裡有乙個遺憾是暫時只支援注入物件型別,即qlist,qmap等容器無法注入。

完整**如下:

c.h

#

pragma

once

#include

classr:

public

qobject

qstring text()

const

noexcept

;void

settext

(const qstring &val)

noexcept

;public slots:

void

slot_recv()

noexcept

;private

: qstring m_text;};

mc_decl_metatype

(r);

classia;

mc_decl_metatype

(ia)

;//!< 這裡必須使用該巨集宣告,否則無法從c轉換到該介面。

classib:

publicia;

mc_decl_metatype

(ib)

;classc:

public

qobject

,public

ibvoida(

)noexcept override;

qstring text()

const

noexcept

;void

settext

(const qstring &val)

noexcept

;/*!

* \brief start

* * 被mc_bean_start巨集標記的函式將會在c被構造後,屬性未被注入前呼叫,即m_r等所有屬性都是預設值

*/q_invokable

mc_started

void

start()

noexcept

;/*!

* \brief finished

* * 當所有屬性都注入完成後呼叫

*/q_invokable

mc_finished

void

finished()

noexcept

;/*!

* \brief threadfinished

* * 如果呼叫過本物件的movetothread函式移動過生存執行緒,則移動之後呼叫此函式,否則不呼叫

*/q_invokable

mc_thread_moved

void

threadfinished()

noexcept

;

signals:

void

signal_send()

;private

: qstring m_text;

//!< 普通字串

rptr m_r;

//!< 物件

qlist m_texts;

//!< 字串列表

qvector m_rs;

//!< 物件陣列

qmap m_mtexts;

//!< 字串對映表

qhash m_hrs;

//!< 物件雜湊表};

mc_decl_metatype

(c);

c.cpp

#

include

"c.h"

#include

#include

mc_init

(r)mc_register_bean_factory

(r);

mc_init_end

qstring r

::text()

const

noexcept

voidr::

settext

(const qstring &val)

noexcept

voidr::

slot_recv()

noexcept

#include

mc_init

(c)mc_register_bean_factory

(c);

mc_register_container_converter

(qlist);

//!< 容器需要額外註冊,只需註冊一次即可到處使用,此巨集多次呼叫只生效一次

mc_register_list_converter

(qvector);

//!< 和mc_register_container_converter效果一樣

mc_register_map_converter

(stringmap)

;//!< 重定義之後需要使用重定義之後的型別

mc_register_container_converter

(rhash)

;//!< 和mc_register_map_converter效果一樣

mc_connect

("this"

,"signal_send()"

,"r"

,"slot_recv()");

mc_init_end

voidc::

a()noexcept

qstring c

::text()

const

noexcept

voidc::

settext

(const qstring &val)

noexcept

voidc::

start()

noexcept

voidc::

finished()

noexcept

voidc::

threadfinished()

noexcept

main.cpp

#

include

#include

#include

#include

#include

#include

"c.h"

intmain

(int argc,

char

*ar**)

執行效果如下:

這裡可以看出只有屬性m_r有值,其他屬性用宣告式暫時無法注入。

這種宣告式注入目前在mcboot專案中有使用,該庫會自動幫你構造滿足某些條件的物件,具體將在講解該專案時具體說明。

Docker容器使用教程

簡介 docker 是乙個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到乙個可移植的容器中,然後發布到任何流行的linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。docker是一種技術,能使得應用在任何環境都能用的打包技術。打包出的東西叫映象。映象執行時...

C set容器使用

stl的set是乙個二叉排序樹,也稱為集合,其在stl內部實現是紅黑樹,能夠將元素預設從小到大排序或者是字典序排序。如果宣告的元素型別不是基本資料型別而是自定義的類要給它乙個比較器,類似於sort的compare。include include include include using names...

C vector容器使用

一 vector容器四種遍歷方式 include include include using namespace std void print vector v bool mycmpare const int a,const int b 定義三個結構體 struct cvector2 struct ...