我在用作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中看到设置:您知道为什么吗?
您是否会想到一种更好的方法来解决此问题?
PS:这是在QGIS代码中完成的。
只需修改您的代码,Qt Designer就会知道在哪里可以找到所需枚举的定义:
pluginType = MODULE
def moduleInformation():
return "qgis.gui", ("QgsMapLayerCombobox", "QgsMapLayerProxyModel" )
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句