gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:03:48 25 4
gpt4 key购买 nike

我在用作 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com