diff --git a/src/widgets/doc/snippets/code/src_gui_qproxystyle.cpp b/src/widgets/doc/snippets/code/src_gui_qproxystyle.cpp index 98dc0ff55b6..636a0f52a83 100644 --- a/src/widgets/doc/snippets/code/src_gui_qproxystyle.cpp +++ b/src/widgets/doc/snippets/code/src_gui_qproxystyle.cpp @@ -48,22 +48,6 @@ ** ****************************************************************************/ -//! [0] -class MyProxyStyle : public QProxyStyle -{ -public: - - int styleHint(StyleHint hint, const QStyleOption *option = nullptr, - const QWidget *widget = nullptr, QStyleHintReturn *returnData = nullptr) const override - { - if (hint == QStyle::SH_UnderlineShortcut) - return 1; - return QProxyStyle::styleHint(hint, option, widget, returnData); - } -}; - -//! [0] - //! [1] #include "textedit.h" #include @@ -93,3 +77,11 @@ int main(int argc, char **argv) //... } //! [1] + +//! [2] +... +auto proxy = new MyProxyStyle(QApplication::style()->name()); +proxy->setParent(widget); // take ownership to avoid memleak +widget->setStyle(proxy); +... +//! [2] diff --git a/src/widgets/styles/qproxystyle.cpp b/src/widgets/styles/qproxystyle.cpp index ecad637957c..31fe587ce26 100644 --- a/src/widgets/styles/qproxystyle.cpp +++ b/src/widgets/styles/qproxystyle.cpp @@ -72,6 +72,13 @@ QT_BEGIN_NAMESPACE or system controlled styles. It would not work on a Mac, for example, where menus are handled by the operating system. + When a proxy style should be set on a specific widget only, you have + to make sure to not set the proxy on the global application style which + is returned by QWidget::style(). You have to create a separate custom style + for the widget similar to: + + \snippet code/src_gui_qproxystyle.cpp 2 + \sa QStyle */ diff --git a/src/widgets/styles/qstyle.cpp b/src/widgets/styles/qstyle.cpp index 239d873649b..9f49a553869 100644 --- a/src/widgets/styles/qstyle.cpp +++ b/src/widgets/styles/qstyle.cpp @@ -421,6 +421,30 @@ QStyle::~QStyle() { } +/*! + Returns the name of the style. + + This value can be used to create a style with QStyleFactory::create(). + + \sa QStyleFactory::create() + \since 6.1 +*/ +QString QStyle::name() const +{ + Q_D(const QStyle); + return d->name; +} + +/*! + \internal + Set the style name +*/ +void QStyle::setName(const QString &name) +{ + Q_D(QStyle); + d->name = name; +} + /*! Initializes the appearance of the given \a widget. diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h index 0e3495306c8..ec13fdb80df 100644 --- a/src/widgets/styles/qstyle.h +++ b/src/widgets/styles/qstyle.h @@ -73,6 +73,8 @@ public: QStyle(); virtual ~QStyle(); + QString name() const; + virtual void polish(QWidget *widget); virtual void unpolish(QWidget *widget); @@ -854,6 +856,9 @@ public: const QStyle * proxy() const; +private: + void setName(const QString &name); + private: Q_DISABLE_COPY(QStyle) friend class QWidget; @@ -861,6 +866,7 @@ private: friend class QApplication; friend class QProxyStyle; friend class QProxyStylePrivate; + friend class QStyleFactory; void setProxy(QStyle *style); }; diff --git a/src/widgets/styles/qstyle_p.h b/src/widgets/styles/qstyle_p.h index 7942cafaf76..ab451d48732 100644 --- a/src/widgets/styles/qstyle_p.h +++ b/src/widgets/styles/qstyle_p.h @@ -72,6 +72,7 @@ public: mutable int layoutSpacingIndex; QStyle *proxyStyle; + QString name; }; inline QImage styleCacheImage(const QSize &size) diff --git a/src/widgets/styles/qstylefactory.cpp b/src/widgets/styles/qstylefactory.cpp index 87a8000ce0f..70d08468ca2 100644 --- a/src/widgets/styles/qstylefactory.cpp +++ b/src/widgets/styles/qstylefactory.cpp @@ -109,8 +109,10 @@ QStyle *QStyleFactory::create(const QString& key) { } // Keep these here - they make the #ifdefery above work if (!ret) ret = qLoadPlugin(loader(), style); - if (ret) + if (ret) { ret->setObjectName(style); + ret->setName(style); + } return ret; }