Qt應用Q D指標

2021-10-10 19:32:57 字數 2119 閱讀 4720

本文主要介紹如何使用qt的q指標和d指標,並開發乙個可拖拽的qwidget作為示例

我們在qt原始碼中經常可以看到q_d/q_q這樣的巨集,這兩個巨集的作用是什麼呢,主要有兩方面用途:

我們來實際編寫乙個可拖拽的qwidget

這兩個巨集建立了公有類和私有類的友元關係,並且建立了兩個指向對方的指標以及兩個訪問方法

#define ci_declare_private(class) \

q_declare_private(class) \

qscopedpointerd_ptr;

#define ci_declare_public(class) \

q_declare_public(class) \

class* q_ptr;

提供了q_d和q_q的定義,提供了公有類和私有類互相訪問的方法:

#define q_d(class) class##private * const d = d_func()

#define q_q(class) class * const q = q_func()

#ifndef cidragablewidget_h

#define cidragablewidget_h

#include #include #include "ci_global.h"

class cidragablewidgetprivate; //前向宣告私有類

class class_export cidragablewidget : public qwidget

;#endif // cidragablewidget_h

#include "cidragablewidget.h"

//************************private************************//

class cidragablewidgetprivate

private:

//資料都定義在私有類內

bool _isdragable;

bool _iskeepvisible;

qpoint _movevector;

};//************************public*************************//

cidragablewidget::cidragablewidget(qwidget *parent) :

qwidget(parent)

, d_ptr(new cidragablewidgetprivate(this)) //記得初始化d指標

cidragablewidget::~cidragablewidget()

bool cidragablewidget::isdragable()

void cidragablewidget::setdragable(bool dragable)

bool cidragablewidget::iskeepvisible()

void cidragablewidget::setkeepvisible(const bool keepvisible)

void cidragablewidget::mousepressevent(qmouseevent *event)

}}void cidragablewidget::mousemoveevent(qmouseevent *event)

if (movepoint.y() <= 0)

if (width() + movepoint.x() >= parentrect.width())

if (height() + movepoint.y() >= parentrect.height())

}move(movepoint);

}}void cidragablewidget::mousereleaseevent(qmouseevent *event)

//重寫此方法以正確使用qt樣式表

void cidragablewidget::paintevent(qpaintevent *event)

至此乙個可拖拽的qwidget容器就實現了,只提供了使用者所需的介面,細節被隱藏在了私有類內

Qt應用發布

通常情況下,使用qt開發應用都是採用動態編譯的方式來進行發布,發布應用的時候就需要將相應的動態鏈結庫檔案一起發布了。應用依賴於哪些dll檔案呢?一般來講,有qtcore4.dll qtgui4.dll之類的了。但是,由於應用可能涉及到其它的模組,如網路模組等。可以檢視乙個.pro檔案了解應用具體涉及...

Qt智慧型指標

很簡單的入門程式,應該比較熟悉吧 在 從 qt 的 delete 說開來 一文中,我們提到這個程式存在記憶體洩露 表現就是析構函式不被呼叫 而且當時給出了三種解決方法 注 本文中,我們從智慧型指標 smart pointer 角度繼續考慮這個問題 為了管理記憶體等資源,c 程式設計師通常採用raii...

Qt的智慧型指標們 Qt

用c 語言開發的乙個難點就是指標,但是指標又是最常用的。有時候開闢了一塊記憶體,但是後續使用完忘記釋放,這就造成記憶體的洩露。為了解決這種尷尬的情況,除了長點心 乙個new對應乙個delete 還有乙個辦法是使用智慧型指標。這裡我只稍微說下qt的常用的智慧型指標們,和c 11的部分智慧型指標很像。如...