2017-02-20 1 views
1

QTカスタムウィジェットのプロパティタイプとしてフラグを使用するのに問題があります。予想されるプロパティは、QT Designerのプロパティエディタに表示されません。QTでカスタムウィジェットのプロパティタイプとしてフラグを使用するにはどうすればよいですか?

コードは以下の通りです:

#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のデザイナーのプロパティエディタでの結果は以下のように示されている: enter image description here

あなたは使用が組み込まれて(プロパティenum_prop(カスタム列挙型を使用)とflag_prop_2を見ることができますQt :: Alignmentフラグ)は期待どおりに動作します。しかし、プロパティflag_propがありません。

私は "%QT_ROOT%\ Qt5.6.0 \ 5.6 \ msvc2013 \ include \ QtWidgets \ qgraphicsview.h"のコードを調べています。

誰も私がなぜそれが期待どおりに動作しないのかについてのヒントを教えてもらえますか?前もって感謝します。

+0

を使用すると、メタオブジェクトモデルへの根本的な列挙型を公開する必要があるのか​​もしれません。 'Q_ENUM(AccessType)'を追加してみてください –

+0

@king_nakはまだ動作しません – ricky

答えて

1

何度も試してみましたが、ついにこの問題を解決しました。キーポイントは:

  1. Q_FLAGSプロパティではMEMBERキーワードが機能しないようです。

  2. Q_DECLARE_OPERATORS_FOR_FLAGSマクロは、グローバル名前空間で使用する必要があります。

    名前空間の会社{

    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

Q_DECLARE_FLAGSマクロを追加しましたか?

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) 

あなたはカレンのオプションを取得するには、プロパティマクロと呼び出し可能関数を追加する必要があります:

Q_PROPERTY(Option option READ getOption()) 
Q_INVOKABLE Option getOption() const; 
これはWindowsStateFlags定義の一例である Q_FLAGS()

の正しい使用方法をも参照してください。

メタタイプqRegisterMetaTypeまたはQ_DECLARE_METATYPE()を登録します。

Q_DECLARE_METATYPE(MyClass::Option); 
+0

あなたの返事をありがとうございます。 Q_FLAGS(SvBasicDemo :: AccessTypes)Q_DECLARE_FLAGS(AccessTypes、AccessType)Q_DECLARE_OPERATORS_FOR_FLAGS(SvBasicDemo :: AccessTypes) '' 'Isは、私の元の投稿に添付されているように、これらのマクロをqgraphicsview.hのコードに従って使用します。私のコードに何か間違っていますか?名前空間と何か関係はありますか? – ricky

関連する問題