本文主要介紹如何使用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的部分智慧型指標很像。如...