Qt设计器自定义小部件:使用标志

Qt设计器自定义小部件:使用标志,qt,qt-designer,qgis,custom-widgets,Qt,Qt Designer,Qgis,Custom Widgets,我对用作QtDesigner自定义小部件的小部件中的标志声明有问题 此小部件是一个使用过滤器代理模型的QComboBox,称为QgsMapLayerComboBox 在过滤器代理模型(QgsMapLayerProxyModel)中,我定义了标志: class GUI_EXPORT QgsMapLayerProxyModel : public QSortFilterProxyModel { Q_OBJECT Q_FLAGS( Filters ) public: enum

我对用作QtDesigner自定义小部件的小部件中的标志声明有问题

此小部件是一个使用过滤器代理模型的QComboBox,称为QgsMapLayerComboBox

在过滤器代理模型(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设计器中直接定义这些设置。 因此,我在组合框类中重用了代理模型类中的标志:

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抱怨:
AttributeError:unknown enum QGSMaplayerProxy Model::RasterLayer
,因为它找不到QGSMaplayerProxy Model

我想到的唯一解决方案是复制QGSMAPLAYERCOMBOX中的标志:

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() ); }
}
class GUI\u导出QgsMapLayerComboBox:public QComboBox
{
Q_对象
Q_标志(过滤器2)
Q_属性(Filters2 Filters2读取Filters2写入设置Filters2)
公众:
typedef QGSMaplayerProxy模型::过滤器过滤器2;
typedef QGSMaplayerProxy模型::过滤器过滤器过滤器2;
显式QGSMAPLAYERCOMBOX(QWidget*parent=0);
//!setFilters允许根据图层类型和/或几何体类型进行拟合。
无效设置过滤器2(过滤器2过滤器);
//!列表层上当前使用的筛选器
Filters2 Filters2(){return static_cast(mProxyModel->filters());}
}
但这不起作用:我看不到Qt设计器中的设置:你知道为什么吗?

您能想出更好的解决方法吗?


PS:这是在QGIS代码中进行的。

只需修改您的代码,这样Qt Designer就知道在哪里可以找到所需枚举的定义:

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