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

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报错:AttributeError: unknown enum QgsMapLayerProxyModel::RasterLayer,因为它找不到QgsMapLayerProxyModel。

我所想到的唯一解决方案就是在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中看不到设置:你知道为什么吗?

你能想到更好的解决方法吗?

附注:这是在QGIS代码中完成的。

1个回答

3
只需要修改代码,这样Qt Designer就知道在哪里找到所需枚举的定义:
pluginType = MODULE
def moduleInformation():
     return "qgis.gui", ("QgsMapLayerCombobox", "QgsMapLayerProxyModel" )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接