use stylesheet rather than palette

add doxygen comments and fix sip bindings
This commit is contained in:
Denis Rouzaud 2017-02-08 16:51:55 +01:00
parent a1369955de
commit 4cba47814b
8 changed files with 236 additions and 139 deletions

View File

@ -1,3 +1,23 @@
class QgsSearchHighlightOptionWidget : QObject
{
%TypeHeaderCode
#include <qgsoptionsdialogbase.h>
%End
public:
explicit QgsSearchHighlightOptionWidget( QWidget* widget = 0 );
~QgsSearchHighlightOptionWidget();
bool isValid();
bool searchHighlight( QString searchText );
void reset();
QWidget* widget();
};
class QgsOptionsDialogBase : QDialog
{
%TypeHeaderCode
@ -32,6 +52,14 @@ class QgsOptionsDialogBase : QDialog
*/
bool iconOnly();
public slots:
/**
* searchText searches for a text in all the pages of the stacked widget and highlight the results
* @param text the text to search
*/
void searchText( QString text );
protected slots:
void updateOptionsListVerticalTabs();
void optionsStackedWidget_CurrentChanged( int indx );
@ -43,4 +71,6 @@ class QgsOptionsDialogBase : QDialog
void paintEvent( QPaintEvent* e );
virtual void updateWindowTitle();
void registerTextSearchWidgets();
};

View File

@ -380,7 +380,7 @@ void QgsCollapsibleGroupBoxBasic::updateStyle()
ss += QLatin1String( " background-color: rgba(0,0,0,0)" );
}
ss += '}';
setStyleSheet( ss );
setStyleSheet( styleSheet() + ss );
// clear toolbutton default background and border and apply offset
QString ssd;

View File

@ -19,6 +19,7 @@
#include <QCheckBox>
#include <QDialog>
#include <QDialogButtonBox>
#include <QEvent>
#include <QGroupBox>
#include <QLabel>
#include <QLayout>
@ -218,8 +219,9 @@ void QgsOptionsDialogBase::searchText( QString text )
if ( !mOptStackedWidget )
return;
mOptStackedWidget->show();
if ( mOptButtonBox )
if ( mOptStackedWidget->isHidden() )
mOptStackedWidget->show();
if ( mOptButtonBox && mOptButtonBox->isHidden() )
mOptButtonBox->show();
// hide all page if text has to be search, show them all otherwise
for ( int r = 0; r < mOptListWidget->count(); ++r )
@ -227,15 +229,14 @@ void QgsOptionsDialogBase::searchText( QString text )
mOptListWidget->setRowHidden( r, !text.isEmpty() );
}
QPair< QgsSearchHighlightOptionWidget, int > rsw;
Q_FOREACH ( rsw, mRegisteredSearchWidgets )
for ( QPair< QgsSearchHighlightOptionWidget*, int > rsw : mRegisteredSearchWidgets )
{
rsw.first.reset();
if ( !text.isEmpty() && rsw.first.searchHighlight( text ) )
rsw.first->reset();
if ( !text.isEmpty() && rsw.first->searchHighlight( text ) )
{
QgsDebugMsg( QString( "Found %1 in %2 (tab: %3)" )
.arg( text )
.arg( rsw.first.widgetName() )
.arg( rsw.first->isValid() ? rsw.first->widget()->objectName() : "no widget" )
.arg( mOptListWidget->item( rsw.second )->text() ) );
mOptListWidget->setRowHidden( rsw.second, false );
}
@ -259,7 +260,7 @@ void QgsOptionsDialogBase::searchText( QString text )
}
}
void QgsOptionsDialogBase::registerTextSearch()
void QgsOptionsDialogBase::registerTextSearchWidgets()
{
mRegisteredSearchWidgets.clear();
@ -267,10 +268,10 @@ void QgsOptionsDialogBase::registerTextSearch()
{
Q_FOREACH ( QWidget* w, mOptStackedWidget->widget( i )->findChildren<QWidget*>() )
{
QgsSearchHighlightOptionWidget shw = QgsSearchHighlightOptionWidget( w );
QgsDebugMsg( QString( "Registering: %1 %2" ).arg( w->objectName() ).arg( shw.isValid() ? "valid" : "invalid" ) );
if ( shw.isValid() )
QgsSearchHighlightOptionWidget* shw = new QgsSearchHighlightOptionWidget( w );
if ( shw->isValid() )
{
QgsDebugMsg( QString( "Registering: %1" ).arg( w->objectName() ) );
mRegisteredSearchWidgets.append( qMakePair( shw, i ) );
}
}
@ -291,7 +292,7 @@ void QgsOptionsDialogBase::showEvent( QShowEvent* e )
if ( mSearchLineEdit )
{
registerTextSearch();
registerTextSearchWidgets();
}
QDialog::showEvent( e );
@ -368,7 +369,14 @@ void QgsOptionsDialogBase::optionsStackedWidget_WidgetRemoved( int indx )
// will need to take item first, if widgets are set for item in future
delete mOptListWidget->item( indx );
registerTextSearch();
QList<QPair< QgsSearchHighlightOptionWidget*, int > >::iterator it = mRegisteredSearchWidgets.begin();
while ( it != mRegisteredSearchWidgets.end() )
{
if (( *it ).second == indx )
it = mRegisteredSearchWidgets.erase( it );
else
++it;
}
}
void QgsOptionsDialogBase::warnAboutMissingObjects()
@ -383,49 +391,48 @@ void QgsOptionsDialogBase::warnAboutMissingObjects()
QgsSearchHighlightOptionWidget::QgsSearchHighlightOptionWidget( QWidget* widget )
: mWidget( nullptr )
, mOriginalPalette( QPalette() )
, mColorRole( QPalette::Window )
, mColor( Qt::yellow )
, mText( [=]( QWidget* ) {return QString();} )
: mWidget( widget )
, mStyleSheet( QString() )
, mValid( true )
, mChangedStyle( false )
, mText( [=]() {return QString();} )
{
if ( !widget )
{
return;
}
if ( qobject_cast<QLabel*>( widget ) )
{
mColorRole = QPalette::Window;
mText = [=]( QWidget * widget ) {return widget ? qobject_cast<QLabel*>( widget )->text() : QString(); };
mStyleSheet = "QLabel { background-color: yellow; color: blue;}";
mText = [=]() {return qobject_cast<QLabel*>( mWidget )->text();};
}
else if ( qobject_cast<QCheckBox*>( widget ) )
{
mColorRole = QPalette::Button;
mText = [=]( QWidget * widget ) {return widget ? qobject_cast<QCheckBox*>( widget )->text() : QString(); };
mStyleSheet = "QCheckBox { background-color: yellow; color: blue;}";
mText = [=]() {return qobject_cast<QCheckBox*>( mWidget )->text();};
}
else if ( qobject_cast<QAbstractButton*>( widget ) )
{
mStyleSheet = "QAbstractButton { background-color: yellow; color: blue;}";
mText = [=]() {return qobject_cast<QAbstractButton*>( mWidget )->text();};
}
else if ( qobject_cast<QGroupBox*>( widget ) )
{
mColorRole = QPalette::WindowText;
mText = [=]( QWidget * widget ) {return widget ? qobject_cast<QGroupBox*>( widget )->title() : QString(); };
mStyleSheet = "QGroupBox::title { background-color: yellow; color: blue;}";
mText = [=]() {return qobject_cast<QGroupBox*>( mWidget )->title();};
}
else
{
return;
mValid = false;
}
if ( mValid )
{
mStyleSheet.prepend( "/*!search!*/" ).append( "/*!search!*/" );
QgsDebugMsg( mStyleSheet );
connect( mWidget, &QWidget::destroyed, this, &QgsSearchHighlightOptionWidget::widgetDestroyed );
}
mWidget = widget;
mOriginalPalette = mWidget->palette();
}
QgsSearchHighlightOptionWidget::~QgsSearchHighlightOptionWidget()
{
}
bool QgsSearchHighlightOptionWidget::isValid()
{
return mWidget;
}
bool QgsSearchHighlightOptionWidget::searchHighlight( QString searchText )
{
bool found = false;
@ -434,20 +441,22 @@ bool QgsSearchHighlightOptionWidget::searchHighlight( QString searchText )
if ( !searchText.isEmpty() )
{
QString origText = mText( mWidget );
QString origText = mText();
if ( origText.contains( searchText, Qt::CaseInsensitive ) )
{
found = true;
}
}
if ( found )
if ( found && !mChangedStyle )
{
QPalette pal( mOriginalPalette );
pal.setColor( mColorRole, mColor );
mWidget->setAutoFillBackground( true );
mWidget->setPalette( pal );
if ( !mWidget->isVisible() )
{
// show the widget to get initial stylesheet in case it's modified
mWidget->show();
}
mWidget->setStyleSheet( mWidget->styleSheet() + mStyleSheet );
mChangedStyle = true;
}
return found;
@ -455,16 +464,16 @@ bool QgsSearchHighlightOptionWidget::searchHighlight( QString searchText )
void QgsSearchHighlightOptionWidget::reset()
{
if ( mWidget )
if ( mValid && mChangedStyle )
{
mWidget->setPalette( mOriginalPalette );
QString ss = mWidget->styleSheet();
ss.remove( mStyleSheet );
mWidget->setStyleSheet( ss );
mChangedStyle = false;
}
}
QString QgsSearchHighlightOptionWidget::widgetName()
void QgsSearchHighlightOptionWidget::widgetDestroyed()
{
QString name;
if ( mWidget )
name = mWidget->objectName();
return name;
mValid = false;
}

View File

@ -38,27 +38,55 @@ class QSplitter;
class QgsFilterLineEdit;
class GUI_EXPORT QgsSearchHighlightOptionWidget
/** \ingroup gui
* \class QgsSearchHighlightOptionWidget
* Container for a widget to be used to search text in the option dialog
* If the widget type is handled, it is valid.
* It can perform a text search in the widget and highlight it in case of success.
* This uses stylesheets.
* @note added in 3.0
*/
class GUI_EXPORT QgsSearchHighlightOptionWidget : public QObject
{
Q_OBJECT
public:
/** Constructor
* @param widget the widget used to search text into
*/
explicit QgsSearchHighlightOptionWidget( QWidget* widget = 0 );
~QgsSearchHighlightOptionWidget();
bool isValid();
/**
* Returns if it valid: if the widget type is handled and if the widget is not still available
*/
bool isValid() {return mValid;}
/**
* search for a text pattern and highlight the widget if the text is found
* @return true if the text pattern is found
*/
bool searchHighlight( QString searchText );
/**
* reset the style to the original state
*/
void reset();
QString widgetName();
/**
* return the widget
*/
QWidget* widget() {return mWidget;}
private slots:
void widgetDestroyed();
private:
QWidget* mWidget;
QPalette mOriginalPalette;
QPalette::ColorRole mColorRole;
QColor mColor;
std::function < QString( QWidget* ) > mText;
QString mStyleSheet;
bool mValid;
bool mChangedStyle;
std::function < QString() > mText;
};
@ -118,6 +146,7 @@ class GUI_EXPORT QgsOptionsDialogBase : public QDialog
/**
* searchText searches for a text in all the pages of the stacked widget and highlight the results
* @param text the text to search
* @note added in 3.0
*/
void searchText( QString text );
@ -133,9 +162,14 @@ class GUI_EXPORT QgsOptionsDialogBase : public QDialog
virtual void updateWindowTitle();
void registerTextSearch();
/**
* register widgets in the dialog to search for text in it
* it is automatically called if a line edit has "mSearchLineEdit" as object name.
* @note added in 3.0
*/
void registerTextSearchWidgets();
QList< QPair< QgsSearchHighlightOptionWidget, int > > mRegisteredSearchWidgets;
QList< QPair< QgsSearchHighlightOptionWidget*, int > > mRegisteredSearchWidgets;
QString mOptsKey;
bool mInit;

View File

@ -17,7 +17,16 @@
<property name="spacing">
<number>6</number>
</property>
<property name="margin">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
@ -59,7 +68,16 @@
<string>Management</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="margin">
<property name="leftMargin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
<item>
@ -124,7 +142,7 @@
</font>
</property>
<property name="styleSheet">
<string notr="true">color: rgb(128, 128, 128);</string>
<string notr="true">QLabel {color: rgb(128, 128, 128);}</string>
</property>
<property name="text">
<string>Note: Editing writes directly to authentication database</string>

View File

@ -311,7 +311,7 @@
<item>
<widget class="QStackedWidget" name="mOptionsStackedWidget">
<property name="currentIndex">
<number>2</number>
<number>12</number>
</property>
<widget class="QWidget" name="mOptionsPageGeneral">
<layout class="QVBoxLayout" name="verticalLayout_3">
@ -340,8 +340,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>691</width>
<height>702</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_28">
@ -1027,7 +1027,7 @@
<x>0</x>
<y>0</y>
<width>843</width>
<height>1110</height>
<height>1065</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_22">
@ -1557,7 +1557,7 @@
<x>0</x>
<y>0</y>
<width>843</width>
<height>755</height>
<height>685</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_27">
@ -1924,8 +1924,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>713</width>
<height>1110</height>
<width>843</width>
<height>936</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_22">
@ -2675,8 +2675,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>151</width>
<height>239</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_46">
@ -2826,8 +2826,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>523</width>
<height>370</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_25">
@ -3169,8 +3169,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>660</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_30">
@ -3600,8 +3600,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>509</width>
<height>623</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_39">
@ -3869,8 +3869,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>572</width>
<height>793</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_31">
@ -4424,8 +4424,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>435</width>
<height>402</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
@ -4563,8 +4563,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>543</width>
<height>710</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_15">
@ -4809,8 +4809,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>292</width>
<height>258</height>
<width>857</width>
<height>680</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_32">
@ -4918,8 +4918,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>534</width>
<height>790</height>
<width>843</width>
<height>689</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_33">

View File

@ -54,6 +54,9 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="mSearchLineEdit"/>
</item>
<item>
<widget class="QListWidget" name="mOptionsListWidget">
<property name="minimumSize">
@ -238,8 +241,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>615</width>
<height>542</height>
<width>266</width>
<height>233</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
@ -463,8 +466,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>615</width>
<height>542</height>
<width>617</width>
<height>547</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
@ -1094,8 +1097,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>435</width>
<height>461</height>
<width>455</width>
<height>384</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
@ -1511,7 +1514,7 @@
<x>0</x>
<y>0</y>
<width>559</width>
<height>217</height>
<height>189</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
@ -1574,7 +1577,7 @@
<string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:'Cantarell'; font-size:11pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
@ -1680,8 +1683,8 @@ p, li { white-space: pre-wrap; }
<rect>
<x>0</x>
<y>0</y>
<width>86</width>
<height>36</height>
<width>98</width>
<height>41</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_16">
@ -1739,8 +1742,8 @@ p, li { white-space: pre-wrap; }
<rect>
<x>0</x>
<y>0</y>
<width>334</width>
<height>659</height>
<width>325</width>
<height>613</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_12">
@ -2194,18 +2197,18 @@ p, li { white-space: pre-wrap; }
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsColorButton</class>
<extends>QToolButton</extends>
<header>qgscolorbutton.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsProjectionSelectionWidget</class>
<extends>QWidget</extends>
@ -2217,17 +2220,17 @@ p, li { white-space: pre-wrap; }
<extends>QWidget</extends>
<header>qgsscalerangewidget.h</header>
</customwidget>
<customwidget>
<class>QgsBlendModeComboBox</class>
<extends>QComboBox</extends>
<header>qgsblendmodecombobox.h</header>
</customwidget>
<customwidget>
<class>QgsLayerTreeEmbeddedConfigWidget</class>
<extends>QWidget</extends>
<header>qgslayertreeembeddedconfigwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsBlendModeComboBox</class>
<extends>QComboBox</extends>
<header>qgsblendmodecombobox.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>mOptionsListWidget</tabstop>

View File

@ -58,6 +58,9 @@
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="mSearchLineEdit"/>
</item>
<item>
<widget class="QListWidget" name="mOptionsListWidget">
<property name="minimumSize">
@ -308,8 +311,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>651</width>
<height>537</height>
<width>653</width>
<height>542</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_13">
@ -505,7 +508,7 @@
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<widget class="QgsScaleRangeWidget" name="mScaleRangeWidget">
<widget class="QgsScaleRangeWidget" name="mScaleRangeWidget" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
@ -774,8 +777,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>721</width>
<height>232</height>
<width>652</width>
<height>216</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_32">
@ -950,7 +953,7 @@
</widget>
</item>
<item row="0" column="1">
<widget class="QgsFieldExpressionWidget" name="mDisplayExpressionWidget">
<widget class="QgsFieldExpressionWidget" name="mDisplayExpressionWidget" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
@ -1001,7 +1004,7 @@
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QgsFieldExpressionWidget" name="mMapTipExpressionFieldWidget">
<widget class="QgsFieldExpressionWidget" name="mMapTipExpressionFieldWidget" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
@ -1045,8 +1048,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>730</width>
<height>537</height>
<width>100</width>
<height>30</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_21">
@ -1111,8 +1114,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>730</width>
<height>537</height>
<width>104</width>
<height>102</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_23">
@ -1280,8 +1283,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>714</width>
<height>641</height>
<width>325</width>
<height>613</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout_3">
@ -1828,9 +1831,9 @@
<container>1</container>
</customwidget>
<customwidget>
<class>QgsFieldExpressionWidget</class>
<class>QgsVariableEditorWidget</class>
<extends>QWidget</extends>
<header>qgsfieldexpressionwidget.h</header>
<header location="global">qgsvariableeditorwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
@ -1839,22 +1842,22 @@
<header>qgsprojectionselectionwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsScaleRangeWidget</class>
<extends>QWidget</extends>
<header>qgsscalerangewidget.h</header>
</customwidget>
<customwidget>
<class>QgsVariableEditorWidget</class>
<extends>QWidget</extends>
<header location="global">qgsvariableeditorwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsScaleComboBox</class>
<extends>QComboBox</extends>
<header>qgsscalecombobox.h</header>
</customwidget>
<customwidget>
<class>QgsFieldExpressionWidget</class>
<extends>QWidget</extends>
<header>qgsfieldexpressionwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsScaleRangeWidget</class>
<extends>QWidget</extends>
<header>qgsscalerangewidget.h</header>
</customwidget>
<customwidget>
<class>QgsLayerTreeView</class>
<extends>QTreeView</extends>