如何仅查找Qt设计器中显示的小部件属性?

如何仅查找Qt设计器中显示的小部件属性?,qt,qwidget,qt-designer,Qt,Qwidget,Qt Designer,如何仅查找Qt设计器在属性编辑器中显示的小部件(例如QPushButton)的那些属性? 我可以使用以下代码找到所有属性,包括Qt设计器中未显示的属性: // Print all available properties of a Widget: qDebug()<<qPrintable("Widget: QPushButton"); QObject *object = new QPushButton; const QMetaObject *metaobject = object-&

如何仅查找Qt设计器在属性编辑器中显示的小部件(例如QPushButton)的那些属性? 我可以使用以下代码找到所有属性,包括Qt设计器中未显示的属性:

// Print all available properties of a Widget:
qDebug()<<qPrintable("Widget: QPushButton");
QObject *object = new QPushButton;
const QMetaObject *metaobject = object->metaObject();
for (int i=0; i<metaobject->propertyCount(); ++i) {
    QMetaProperty metaproperty = metaobject->property(i);
    const char *name = metaproperty.name();
    QVariant value = object->property(name);
    qDebug()<<qPrintable("\n" + QString(name) + "\n" + QString(value.typeName()));
}
//打印小部件的所有可用属性:
qDebug()属性(i);
const char*name=metaproperty.name();
QVariant value=对象->属性(名称);
qDebug()应该说明该属性是否将显示在Qt设计器中

如Qt中所述:

可设计属性指示属性是否应在GUI设计工具(例如Qt Designer)的属性编辑器中可见。大多数属性都是可设计的(默认为true)。您可以指定布尔成员函数,而不是true或false

此外,似乎在设计器中未显示只读属性

以你为例:

    // Print all available properties of a Widget:
    qDebug()<<qPrintable("Widget: QPushButton");
    QPushButton *object = new QPushButton(this);
    const QMetaObject *metaobject = object->metaObject();
    for (int i=0; i<metaobject->propertyCount(); ++i) {
        QMetaProperty metaproperty = metaobject->property(i);
        const char *name = metaproperty.name();
        QVariant value = object->property(name);
        bool isReadOnly = metaproperty.isReadable() && !metaproperty.isWritable();
        bool isWinModal = metaproperty.name() == QString("windowModality"); // removed windowModality manually
        if(!isReadOnly && metaproperty.isDesignable(object) && !isWinModal){
            qDebug() << metaproperty.name();
        }
    }
但在这方面有几个警告:

  • 设计器上的属性可见性可以由其他属性设置为打开或关闭。例如,仅当布尔属性
    setCheckable
    设置为true时,
    checked
    属性才可设计
从QAbstractButton定义中提取:

Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable)
Q_PROPERTY(bool checked READ isChecked WRITE setChecked DESIGNABLE isCheckable NOTIFY toggled USER true)

  • 因此,为了达到您想要的效果,我排除了只读和
    windowModality
    属性,但这有点不太靠谱。我不确定是否有更好的方法来做到这一点

它没有按预期工作。例如,在设计器中未显示以下QPushButton属性,但它们是可设计的:frameGeometry、normalGeometry、frameSize、childrenRect等。您提到的只读属性似乎从未在设计器中显示,无论它们是否可设计。可能,您可以修改代码以检查
isReadable()
,但不检查
isWritable()
,并将其排除在外。以下代码删除了许多不相关的属性,但我仍然可以看到一些属性,如windowModality、frameGeometry、normalGeometry、childrenRect、windowIcon、windowIconText、windowOpacity、,windowModified等未在Qt Designer中显示。这些属性仅针对应用程序的根/父小部件显示,如QMainWindow或QWidget。代码:我认为您的代码是完美的,因为我注意到Qt Designer也使用这种黑客方法,例如,请参见以下链接中的第638行和第1907行:
Q_PROPERTY(bool checkable READ isCheckable WRITE setCheckable)
Q_PROPERTY(bool checked READ isChecked WRITE setChecked DESIGNABLE isCheckable NOTIFY toggled USER true)