3

QtDesigner のカスタム ウィジェットとして使用されるウィジェットのフラグの宣言に問題があります。

このウィジェットは、QgsMapLayerComboBox と呼ばれるフィルター プロキシ モデルを使用する QComboBox です。

フィルター プロキシ モデル (QgsMapLayerProxyModel) で、フラグを定義しました。

class GUI_EXPORT QgsMapLayerProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
    Q_FLAGS( Filters )
  public:
    enum Filter
    {
      NoFilter = 1,
      RasterLayer = 2,
      NoGeometry = 4,
      PointLayer = 8,
      LineLayer = 16,
      PolygonLayer = 32,
      HasGeometry = PointLayer | LineLayer | PolygonLayer,
      VectorLayer = NoGeometry | HasGeometry
    };
    Q_DECLARE_FLAGS( Filters, Filter )

    ...
};

Q_DECLARE_OPERATORS_FOR_FLAGS( QgsMapLayerProxyModel::Filters )

これらの設定を Qt Designer で直接定義できるようにしたいと考えています。したがって、コンボ ボックス クラスでプロキシ モデル クラスのフラグを再利用しました。

class GUI_EXPORT QgsMapLayerComboBox : public QComboBox
{
    Q_OBJECT

    Q_FLAGS( QgsMapLayerProxyModel::Filters )
    Q_PROPERTY( QgsMapLayerProxyModel::Filters filters READ filters WRITE setFilters )

  public:
    explicit QgsMapLayerComboBox( QWidget *parent = 0 );

    //! setFilters allows fitering according to layer type and/or geometry type.
    void setFilters( QgsMapLayerProxyModel::Filters filters );

    //! currently used filter on list layers
    QgsMapLayerProxyModel::Filters filters(){ return mProxyModel->filters(); }
}

これは期待どおりに機能しています。

ただし、これらのウィジェットは、SIP を使用して Python ライブラリにもコンパイルされています。pyuic 用のモジュールを (/usr/lib/python2.7/dist-packages/PyQt4/uic/widget-plugins に) 作成したので、ウィジェットを探す場所がわかります。

pluginType = MODULE
def moduleInformation():
    return "qgis.gui", ("QgsMapLayerCombobox", )

さて、問題は pyuic が不平を言うことです: QgsMapLayerProxyModelAttributeError: unknown enum QgsMapLayerProxyModel::RasterLayerが見つからないためです。

私の頭に浮かんだ唯一の解決策は、QgsMapLayerComboBox でフラグを複製することでした。

class GUI_EXPORT QgsMapLayerComboBox : public QComboBox
{
    Q_OBJECT

    Q_FLAGS( Filters2 )
    Q_PROPERTY( Filters2 filters2 READ filters2 WRITE setFilters2 )

  public:
    typedef QgsMapLayerProxyModel::Filter Filter2;
    typedef QgsMapLayerProxyModel::Filters Filters2;

    explicit QgsMapLayerComboBox( QWidget *parent = 0 );

    //! setFilters allows fitering according to layer type and/or geometry type.
    void setFilters2( Filters2 filters );

    //! currently used filter on list layers
    Filters2 filters2(){ return static_cast<Filters2>( mProxyModel->filters() ); }
}

しかし、これはうまくいきません: Qt Designer に設定が表示されません: 理由はわかりますか?

これを解決するためのより良い方法を考えてみませんか?

PS: これは QGIS コード内で作成されます。

4

1 に答える 1

3

コードを変更するだけで、必要な列挙型の定義がどこにあるかを Qt Designer が認識できるようになります。

pluginType = MODULE
def moduleInformation():
     return "qgis.gui", ("QgsMapLayerCombobox", "QgsMapLayerProxyModel" )
于 2014-05-08T11:59:02.973 に答える