天天看點

Qt每天一個小技巧之QObject ::children 以及對應findChildren

說好的計劃,就要實作,今年我要把吹過的牛皮,設定的計劃,統統給圓了。

打開Qt幫助文檔,下個小技巧就是children 函數啦。

Qt每天一個小技巧之QObject ::children 以及對應findChildren

與children 對應的還有findChild、findChildren等函數,今天就帶大家一起來記錄這個小技巧。

Qt每天一個小技巧之QObject ::children 以及對應findChildren

QObject 以對象樹的形式組織起來。當為一個對象建立子對象時,子對象會自動地添加到父對象的children()清單中。父對象擁有子對象的所有權,比如父對象可以在自己的析構函數中删除它的孩子對象。使用findChild()或findChildren()通過名字和類型查詢孩子對象。

children()

我們建立了一個工程,MainWindow,我們簡單的向上托放兩個控件,如下圖:

Qt每天一個小技巧之QObject ::children 以及對應findChildren

然後我們在構造函數中使用children函數,看看會有什麼效果。

QObjectList childlist = this->children(); //擷取子類清單
    int length =  childlist.length();
    qDebug()<< length << endl;

    for(auto list:childlist)
    {
        qDebug()<< list << endl;
    }
           

輸出結果:

Qt每天一個小技巧之QObject ::children 以及對應findChildren

我們會發現,為啥沒有托上去的兩個控件的對象呢。這裡一定要記住children傳回的目前父類對應的子類,目前的父類隻有上面5個子類。然而我們托上去按鈕他們的父類是centralWidget。

我們在加代碼,驗證一下是不是這個原因:

QObjectList child2 = ui->centralWidget->children();
    for(auto list:child2)
    {
        qDebug()<< list << endl;
    }
           

輸出: 

Qt每天一個小技巧之QObject ::children 以及對應findChildren

看來我們的驗證是對的。

findChildren()

傳回該對象的所有具有可轉換為類型T的給定名稱的子對象,

如果沒有這樣的對象,則為空清單。省略name參數将導緻比對所有對象名稱。搜尋是遞歸執行的,除非選項指定FindDirectChildrenOnly選項。

 我們使用代碼來查找:

void MainWindow::on_pushButton_clicked()
{
    QPushButton * btn = this->findChild<QPushButton *>("pushButton");
    qDebug()<< btn->objectName() << endl;
     QPushButton * btn2 = this->findChild<QPushButton *>("pushButton1");
     if(btn2)
     {
          qDebug()<< btn2->objectName() << endl;
     }
     else
     {
          qDebug()<< "no btn2" << endl;
     }

}
           

輸出結果:

Qt每天一個小技巧之QObject ::children 以及對應findChildren

然後我們了解這些功能性,文檔給我們很多例子:

QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
 QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
 QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(), 
 Qt::FindDirectChildrenOnly);
           

這裡可以查找很多同類型的,放入一個清單中,我們可以對他處理。

Qt每天一個小技巧之QObject ::children 以及對應findChildren

我們又加了4個QLineEdit 的控件,我們可以同時對4個進行操作。

QList<QLineEdit*> nline = this->findChildren<QLineEdit*>(); //擷取此類的全部
     for(auto line : nline)
     {
         line->setText("比卡丘不皮");
     }
           

輸出結果: 

Qt每天一個小技巧之QObject ::children 以及對應findChildren

 是不是很香,還可以在一個對應的全部連結槽,這樣就并不需要每個都寫一個槽,一次性多個操作就是香。

喜歡的朋友可以關注我的部落格,讓我們每天都在進步。明天不見不散。

繼續閱讀