如何比較QWidgets? 可以說我有一個列表,並且想要更改僅Widgets的尺寸QPushButton
:比較QWidgets
例如,是否有任何功能或方法可以做到這一點?
QList<QLayoutItem *> itemList;
if(itemList->Items->type() == QPushButton)
{
item.setGeometry(newRect);
}
如何比較QWidgets? 可以說我有一個列表,並且想要更改僅Widgets的尺寸QPushButton
:比較QWidgets
例如,是否有任何功能或方法可以做到這一點?
QList<QLayoutItem *> itemList;
if(itemList->Items->type() == QPushButton)
{
item.setGeometry(newRect);
}
實際上有幾種方法可以做到這一點。 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()函數時,編譯器無法檢查,因此代碼將繼續編譯而不會出現問題,但在運行時不起作用。
您可以使用QMetaObject::className
獲得類的類型,如果它得到了QObject
元類型的信息,這QPushButton
應該。有關文檔的更多信息here: QMetaObject className。
是的,但'inherits'也處理子類。 – user1095108
據我所知,'className'實際上會查找祖先來找到匹配。所以'MyPushButton'繼承'QPushButton',但沒有指定元信息,所以'className'在'QPushButton'上返回。至少這是文檔指定的內容:http://qt-project.org/doc/qt-4.8/metaobjects.html –
標準的C++方式是使用dynamic_cast<QPushButton*>(widget)
。
Qt通過它的元對象系統提供了替代方案。一個是qobject_cast
,其工作原理與dynamic_cast
類似,但可能更可取。
或者,你可以通過它的元對象獲得任何QObject的類名。例如:
if(strcmp(widget->metaObject()->className(), "QPushButton") == 0)
有關Qt元對象的更多信息,請參閱here。
我打算檢查這個答案,但上面的答案解釋了不使用'className'。這是工作以及... –
謝謝,它的作品! :) –