中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt中的對象樹機制是什么

發布時間:2023-03-21 13:47:52 來源:億速云 閱讀:89 作者:iii 欄目:開發技術

這篇文章主要介紹“Qt中的對象樹機制是什么”,在日常操作中,相信很多人在Qt中的對象樹機制是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Qt中的對象樹機制是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Qt提供了對象樹機制,能夠自動、有效的組織和管理繼承自QObject的Qt對象。

每個繼承自QObject類的對象通過它的對象鏈表(QObjectList)來管理子類對象,當用戶創建一個子對象時,其對象鏈表相應更新子類對象信息,對象鏈表可通過children()獲取。

當父對象析構的時候,其對象鏈表中的所有(子)對象也會被析構,父對象會自動將其從父對象列表中刪除。Qt 保證沒有對象會被 delete 兩次。開發中手動回收資源時建議使用deleteLater代替delete,因deleteLater多次是安全的,而delete多次是不安全的。

示例

新建QWidget項目。添加四個類,分別繼承QLable、QPushButton、QRadioButton、QGridLayout

class MyLabel : public QLabel;
class MyLayout : public QGridLayout;
class MyPushButton : public QPushButton;
class MyRadioButton : public QRadioButton;

每個子類聲明構造和析構函數,函數實現中僅使用qDebug( )輸出標識句

//MyLabel類
MyLabel::MyLabel(QWidget *parent):QLabel(parent)
{
    qDebug()<<"MyLabel構造"<<this;
}
 
MyLabel::~MyLabel()
{
    qDebug()<<"MyLabel析構"<<this;
}
//MyLayout類
MyLayout::MyLayout(QWidget *parent):QGridLayout(parent)
{
    qDebug()<<"MyLayout構造"<<this;
}
MyLayout::~MyLayout()
{
    qDebug()<<"MyLayout析構"<<this;
}
//MyPushButton類
MyPushButton::MyPushButton(QWidget *parent):QPushButton(parent)
{
    qDebug()<<"MyPushButton構造"<<this;
}
MyPushButton::~MyPushButton()
{
    qDebug()<<"MyPushButton析構"<<this;
}
//MyRadioButton類
MyRadioButton::MyRadioButton(QWidget *parent):QRadioButton(parent)
{
    qDebug()<<"MyRadioButton構造"<<this;
}
MyRadioButton::~MyRadioButton()
{
    qDebug()<<"MyRadioButton析構"<<this;
}

在main函數中,初始化控件和布局管理器,將當前窗體設為控件和布局管理器的父窗體;將控件添加到布局管理器中

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
 
    //當前窗體設為父窗體
    MyLabel *myLabel =new MyLabel(&w);
    MyPushButton*myBtn=new MyPushButton(&w);
    MyRadioButton*myRbtn=new MyRadioButton(&w);
    MyLayout*myLayout=new MyLayout(&w);
    //設置文本
    myLabel->setText("子標簽");
    myBtn->setText("子按鈕");
    myRbtn->setText("子單選");
    //控件添加到布局管理器中
    myLayout->addWidget(myLabel,0,0);
    myLayout->addWidget(myBtn,1,0);
    myLayout->addWidget(myRbtn,2,0);
 
    return a.exec();
 
}

運行結果:

Qt中的對象樹機制是什么

Qt中的對象樹機制是什么

我們可以看到:在初始化時,當前窗體會先執行構造,隨后是其子類執行構造;當窗體關閉時,當前窗體會先執行析構,隨后是其子類執行析構,也就是說程序會自動、有效的組織和管理繼承自QObject的Qt對象。 只要父類是QObject下的派生類,當父類被銷毀或者創建時,其子類也會跟著創建和銷毀。

我們可以使用.children( )函數查看一個類的派生類。這里我們查看當前窗體的派生類。

const QObjectList listW=w.children();
qDebug()<<"w.children()";
foreach (QObject* obj, listW) {
    qDebug()<<obj;
}

運行結果:

Qt中的對象樹機制是什么

從運行結果我們可以看到: 當我們對控件和布局管理器初始化時,已經將當前窗體設為其父窗體。這些控件和布局管理器也就順應成章成為當前窗體的子類。

我們繼續對標簽控件派生子類

//創建一個sun布局管理器,將標簽控件設為其父窗體
MyLayout*sunLayout=new MyLayout(myLabel);
//創建三個按鈕控件,這里并未指明其父窗體
MyPushButton*sunBtn1=new MyPushButton;
MyPushButton*sunBtn2=new MyPushButton;
MyPushButton*sunBtn3=new MyPushButton;
//設置文本
sunBtn1->setText("孫按鈕1");
sunBtn2->setText("孫按鈕2");
sunBtn3->setText("孫按鈕3");
//將按鈕添加到布局管理器中
sunLayout->addWidget(sunBtn1);
sunLayout->addWidget(sunBtn2);
sunLayout->addWidget(sunBtn3);
//按鈕初始時未設定父類,只是將其放入sun布局管理器中。
//sun布局管理器的父窗體設定為myLabel,當myLabel指定其布局管理器為孫布局管理器時,按鈕會重新將myLabel設定為其父窗體
myLabel->setLayout(sunLayout);

Qt中的對象樹機制是什么

Qt中的對象樹機制是什么

繼續使用.children( )查看標簽類的派生類

//查看w子類
const QObjectList listW=w.children();
qDebug()<<"w.children()";
foreach (QObject* obj, listW) {
    qDebug()<<obj;
}
 
//查看myLabel子類
const QObjectList listLabel=myLabel->children();
qDebug()<<"myLabel.children()";
foreach (QObject* obj, listLabel) {
    qDebug()<<obj;
}

執行結果:

Qt中的對象樹機制是什么

到此,關于“Qt中的對象樹機制是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

静安区| 团风县| 华亭县| 丰镇市| 龙游县| 靖宇县| 龙川县| 洛宁县| 齐河县| 新疆| 太湖县| 额济纳旗| 肥乡县| 龙川县| 米泉市| 衡阳市| 连南| 潜江市| 衢州市| 灌阳县| 孟连| 绍兴县| 鹿邑县| 普兰县| 江源县| 庆元县| 永顺县| 赤壁市| 南岸区| 通江县| 安福县| 泸西县| 阿尔山市| 南昌市| 北安市| 牙克石市| 长泰县| 图片| 麻江县| 舞钢市| 义乌市|