Как использовать флаги в качестве пользовательских свойств виджета в QT?

У меня проблемы с использованием флагов в качестве типа свойства QT. Ожидаемое свойство не отображается в редакторе свойств QT Designer.

Код как ниже:

#ifndef SVBASICDEMO_H
#define SVBASICDEMO_H

#include <QString>
#include <QtUiPlugin/QDesignerExportWidget>
#include <QWidget>
#include <QLabel>
#include "svbasicwidget.h"
QT_BEGIN_NAMESPACE

namespace Company {
namespace Product {
namespace Widget {
namespace Basic {
class QDESIGNER_WIDGET_EXPORT SvBasicDemo : public SvBasicWidget
{
Q_OBJECT
Q_FLAGS(SvBasicDemo::AccessTypes)
Q_PROPERTY(QString url_prop MEMBER url_prop NOTIFY propertyChange)
Q_PROPERTY(Priority enum_prop MEMBER enum_prop NOTIFY propertyChange)
Q_PROPERTY(AccessTypes flag_prop MEMBER flag_prop NOTIFY propertyChange)
Q_PROPERTY(Qt::Alignment flag_prop_2 MEMBER flag_prop_2 NOTIFY propertyChange)

Q_SIGNALS:
void propertyChange();

public slots:
//更新属性的槽
void updateProperty();

public:
SvBasicDemo(QWidget *parent = 0);
virtual void refresh_binding_cb();
virtual QString help_info() const;

enum Priority { High, Low, VeryHigh, VeryLow };
Q_ENUM(Priority)

enum AccessType { Read = 0x1, Write = 0x2 };

Q_DECLARE_FLAGS(AccessTypes, AccessType)

private:
QString url_prop;
Priority enum_prop;
AccessTypes flag_prop;
Qt::Alignment flag_prop_2;
QLabel label;
};

Q_DECLARE_OPERATORS_FOR_FLAGS(SvBasicDemo::AccessTypes)

}
}
}
}

QT_END_NAMESPACE
#endif

Результат в редакторе свойств qt designer показан ниже:
введите описание изображения здесь

Вы можете видеть, что свойства enum_prop (использовать пользовательский enum) и flag_prop_2 (использовать встроенный флаг Qt :: Alignment) работают как положено. Но свойство flag_prop отсутствует.

Я изучил код в «% QT_ROOT% \ Qt5.6.0 \ 5.6 \ msvc2013 \ include \ QtWidgets \ qgraphicsview.h»。 И не выяснил, почему.

Может ли кто-нибудь дать мне подсказку о том, почему это не работает, как ожидалось? Заранее спасибо.

1

Решение

Попробовав много раз, наконец-то решил эту проблему. Ключевым моментом является:

  1. Кажется, ключевое слово MEMBER не работает со свойством Q_FLAGS;

  2. Макрос Q_DECLARE_OPERATORS_FOR_FLAGS должен использоваться в глобальном пространстве имен;

    namespace Company {

        namespace Product {
    namespace Widget {
    namespace Basic {
    class QDESIGNER_WIDGET_EXPORT SvBasicDemo : public SvBasicWidget
    {
    Q_OBJECT
    Q_FLAGS(AccessTypes)
    Q_PROPERTY(QString url_prop MEMBER url_prop NOTIFY propertyChange)
    Q_PROPERTY(Priority enum_prop MEMBER enum_prop NOTIFY propertyChange)
    // Q_PROPERTY(AccessTypes flag_prop MEMBER flag_prop NOTIFY propertyChange) // Cannot use MEMBER here, otherwise, the property will not show on qt designer property editor. I don't know why.
    Q_PROPERTY(AccessTypes flag_prop READ getAccessTypes WRITE setAccessTypes)
    Q_PROPERTY(Qt::Alignment flag_prop_3 MEMBER flag_prop_2 NOTIFY propertyChange)
    
    Q_SIGNALS:
    void propertyChange();
    
    public slots:
    void updateProperty();
    
    public:
    SvBasicDemo(QWidget *parent = 0);
    virtual void refresh_binding_cb();
    virtual QString help_info() const;
    
    enum Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)
    
    enum AccessType { None = 0x0, Read = 0x1, Write = 0x2 };
    Q_DECLARE_FLAGS(AccessTypes, AccessType)
    
    inline AccessTypes getAccessTypes() const
    {
    return flag_prop;
    }
    inline void setAccessTypes(AccessTypes features)
    {
    flag_prop = features;
    }
    
    private:
    QString url_prop;
    Priority enum_prop;
    AccessTypes flag_prop;
    Qt::Alignment flag_prop_2;
    QLabel label;
    };
    }
    }
    }
    }
    // must use this macro outside namespace
    Q_DECLARE_OPERATORS_FOR_FLAGS(Company::Product::Widget::Basic::SvBasicDemo::AccessTypes)
    
1

Другие решения

Вы добавили Q_DECLARE_FLAGS макрос? Смотрите также правильное использование Q_FLAGS ()

Это пример определения WindowsStateFlags:

class MyClass
{
public:
enum Option {
NoOptions = 0x0,
ShowTabs = 0x1,
ShowAll = 0x2,
SqueezeBlank = 0x4
};
Q_DECLARE_FLAGS(Options, Option)
Q_FLAGS(Options)
...
};

Q_DECLARE_OPERATORS_FOR_FLAGS(MyClass::Option)

Вы должны добавить макрос свойства и вызываемую функцию, чтобы получить опцию current:

Q_PROPERTY(Option option READ getOption())
Q_INVOKABLE Option getOption() const;

И зарегистрируйте метатип qRegisterMetaType или Q_DECLARE_METATYPE ():

Q_DECLARE_METATYPE(MyClass::Option);
0

По вопросам рекламы [email protected]