2014-05-07 109 views
2

我在用作QtDesigner自定義小部件的小部件中的標誌聲明有問題。Qt設計器自定義小部件:使用標誌

這個小工具使用過濾器代理模型,稱爲QgsMapLayerComboBox

在過濾代理模型(QgsMapLayerProxyModel)一QComboBox,我已經定義的標誌:

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代碼中製作的。

回答

2

只需修改代碼,所以Qt設計就知道在哪裏可以找到定義所需的枚舉:

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

完美,非常感謝! –

相關問題