Qt 设计器自定义小部件 : using flags

标签 qt qt-designer qgis custom-widgets

我在用作 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 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 中看不到设置:你知道为什么吗?

您能想到更好的方法来解决这个问题吗?

PS:这是用 QGIS 代码制作的。

最佳答案

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

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

关于Qt 设计器自定义小部件 : using flags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23522364/

相关文章:

c++ - 在 QCalendarWidget 中禁止选择将来的日期

c++ - 样式表/Qt Designer 是否支持高 dpi 屏幕?

javascript - 我在哪里可以获得印度的 .geojson 文件,而不是每个州/地区或任何其他区别的单独文件?

python - Tkinter 值得学习吗?

qt - 编译Qt UI文件?

c++ - 如何覆盖 QTextEdit 的 keyPressEvent?

r - Google Maps Platform 最多 60 个结果限制的解决方法

python - 如果前一个字段为空,则用以前的数据填充表中的下一个字段

c++ - 从文件名变量中删除 ".txt"

python - pyqt按钮自动绑定(bind)到on_..._clicked函数,无需connect或pyqtSlot