2013-07-22 51 views
2

如何比較QWidgets? 可以說我有一個列表,並且想要更改僅Widgets的尺寸QPushButton比較QWidgets

例如,是否有任何功能或方法可以做到這一點?

QList<QLayoutItem *> itemList; 

if(itemList->Items->type() == QPushButton) 
{ 
    item.setGeometry(newRect); 
} 

回答

4

實際上有幾種方法可以做到這一點。 QObject::inherits()是:

for (int i = 0; i < itemList.size(); ++i) { 
    if (itemList[i]->inherits("QPushButton")) { 
     itemList[i]->setGeometry(newRect); 
    } 
} 

另一種方法是使用qobject_cast,這是我的建議。

for (int i = 0; i < itemList.size(); ++i) { 
    if (qobject_cast<QPushButton*>(itemList[i])) { 
     itemList[i]->setGeometry(newRect); 
    } 
} 

注意qobject_cast不需要RTTI支持,在編譯器中啓用:如果對象不從你投給類(直接或沒有)繼承它返回一個空指針。

當然還有它確實需要啓用RTTI支持標準C++的dynamic_cast:

for (int i = 0; i < itemList.size(); ++i) { 
    if (dynamic_cast<QPushButton*>(itemList[i])) { 
     itemList[i]->setGeometry(newRect); 
    } 
} 

會出現乍一看還行,但最終不應該在這種情況下使用另一種方法,是QMetaObject ::班級名稱()。不要使用它,因爲使用QPushButton子類會得到錯誤的否定結果。

我推薦qobject_cast的原因是因爲它允許編譯器檢查typename。更改班級名稱時,這很重要。當使用基於字符串的QObject :: inherits()函數時,編譯器無法檢查,因此代碼將繼續編譯而不會出現問題,但在運行時不起作用。

+0

謝謝,它的作品! :) –

2

您可以使用QMetaObject::className獲得類的類型,如果它得到了QObject元類型的信息,這QPushButton應該。有關文檔的更多信息here: QMetaObject className

+0

是的,但'inherits'也處理子類。 – user1095108

+0

據我所知,'className'實際上會查找祖先來找到匹配。所以'MyPushButton'繼承'QPushButton',但沒有指定元信息,所以'className'在'QPushButton'上返回。至少這是文檔指定的內容:http://qt-project.org/doc/qt-4.8/metaobjects.html –

0

標準的C++方式是使用dynamic_cast<QPushButton*>(widget)

Qt通過它的元對象系統提供了替代方案。一個是qobject_cast,其工作原理與dynamic_cast類似,但可能更可取。

或者,你可以通過它的元對象獲得任何QObject的類名。例如:

if(strcmp(widget->metaObject()->className(), "QPushButton") == 0) 

有關Qt元對象的更多信息,請參閱here

+0

我打算檢查這個答案,但上面的答案解釋了不使用'className'。這是工作以及... –