說好的計劃,就要實作,今年我要把吹過的牛皮,設定的計劃,統統給圓了。
打開Qt幫助文檔,下個小技巧就是children 函數啦。
與children 對應的還有findChild、findChildren等函數,今天就帶大家一起來記錄這個小技巧。
QObject 以對象樹的形式組織起來。當為一個對象建立子對象時,子對象會自動地添加到父對象的children()清單中。父對象擁有子對象的所有權,比如父對象可以在自己的析構函數中删除它的孩子對象。使用findChild()或findChildren()通過名字和類型查詢孩子對象。
children()
我們建立了一個工程,MainWindow,我們簡單的向上托放兩個控件,如下圖:
然後我們在構造函數中使用children函數,看看會有什麼效果。
QObjectList childlist = this->children(); //擷取子類清單
int length = childlist.length();
qDebug()<< length << endl;
for(auto list:childlist)
{
qDebug()<< list << endl;
}
輸出結果:
我們會發現,為啥沒有托上去的兩個控件的對象呢。這裡一定要記住children傳回的目前父類對應的子類,目前的父類隻有上面5個子類。然而我們托上去按鈕他們的父類是centralWidget。
我們在加代碼,驗證一下是不是這個原因:
QObjectList child2 = ui->centralWidget->children();
for(auto list:child2)
{
qDebug()<< list << endl;
}
輸出:
看來我們的驗證是對的。
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;
}
}
輸出結果:
然後我們了解這些功能性,文檔給我們很多例子:
QList<QWidget *> widgets = parentWidget.findChildren<QWidget *>("widgetname");
QList<QPushButton *> allPButtons = parentWidget.findChildren<QPushButton *>();
QList<QPushButton *> childButtons = parentWidget.findChildren<QPushButton *>(QString(),
Qt::FindDirectChildrenOnly);
這裡可以查找很多同類型的,放入一個清單中,我們可以對他處理。
我們又加了4個QLineEdit 的控件,我們可以同時對4個進行操作。
QList<QLineEdit*> nline = this->findChildren<QLineEdit*>(); //擷取此類的全部
for(auto line : nline)
{
line->setText("比卡丘不皮");
}
輸出結果:
是不是很香,還可以在一個對應的全部連結槽,這樣就并不需要每個都寫一個槽,一次性多個操作就是香。
喜歡的朋友可以關注我的部落格,讓我們每天都在進步。明天不見不散。