2017-02-20 1 views
1

Ich habe Probleme, Flags als QT benutzerdefinierte Widget-Eigenschaft Typ zu verwenden. Die erwartete Eigenschaft wird im QT Designer-Eigenschaftseditor nicht angezeigt.Wie verwendet man Flags als benutzerdefinierten Widget-Eigenschaftstyp in QT?

ist der Code wie folgt:

#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 

Das Ergebnis in qt Designer Eigenschaftseditor ist wie folgt: enter image description here

Sie Eigenschaft enum_prop (Verwendung benutzerdefinierte Enum) sehen und flag_prop_2 (Einsatz gebaut in Flag Qt :: Alignment) funktioniert wie erwartet. Aber die Eigenschaft flag_prop fehlt.

Ich habe den Code in "% QT_ROOT% \ Qt5.6.0 \ 5.6 \ msvc2013 \ include \ QtWidgets \ qgraphicsview.h" studiert und nicht herausgefunden, warum.

Kann mir jemand einen Hinweis geben, warum es nicht wie erwartet funktioniert? Danke im Voraus.

+0

könnte sein, dass Sie die zugrunde liegende Enum zum Metaobjektmodell auszusetzen haben. Versuchen Sie, 'Q_ENUM (AccessType)' –

+0

@king_nak immer noch nicht arbeiten – ricky

Antwort

1

Nach vielen Versuchen, endlich das Problem gelöst. Der entscheidende Punkt ist:

  1. Es scheint, MEMBER-Schlüsselwort funktioniert nicht mit Q_FLAGS-Eigenschaft;

  2. Q_DECLARE_OPERATORS_FOR_FLAGS Makro muss im globalen Namespace verwendet werden;

    Namespace Firma {

    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) 
    
0

Haben Sie das Makro Q_DECLARE_FLAGS hinzugefügt? Dies ist ein Beispiel der WindowsStateFlags Definition auch die korrekte Verwendung von Q_FLAGS()

Siehe:

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) 

Sie haben die Eigenschaft, Makro und die aufrufbaren Funktion hinzuzufügen, um die curren Option zu erhalten:

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

Und registrieren Sie den Metatyp qRegisterMetaType oder Q_DECLARE_METATYPE():

Q_DECLARE_METATYPE(MyClass::Option); 
+0

Vielen Dank für Ihre Antwort. Wie in meinem ursprünglichen Beitrag angehängt, benutze ich diese Makros nach dem folgenden Code in qgraphicsview.h: '' '' Q_FLAGS (SvBasicDemo :: AccessTypes) Q_DECLARE_FLAGS (AccessTypes, AccessType) Q_DECLARE_OPERATORS_FOR_FLAGS (SvBasicDemo :: AccessTypes) '' '' Is ist etwas in meinem Code falsch? Gibt es etwas mit dem Namensraum zu tun? – ricky

Verwandte Themen