QStyle: add name() to return the name of the style

Currently there is no way to get the name of the current style to e.g.
create a QProxyStyle for a specific widget only.
Therefore add QStyle::name() so QProxyStyle(const QString &) can be
called without hard-coding the style name.
Remove an unused doc snippet as drive-by.

Fixes: QTBUG-8004
Change-Id: I466c5e870a5392b238365bdc930f6a2ecee50cdb
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
This commit is contained in:
Christian Ehrlicher 2020-12-30 13:55:27 +01:00
parent 47c6b5b91e
commit 1bcfada9f0
6 changed files with 49 additions and 17 deletions

View File

@ -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] //! [1]
#include "textedit.h" #include "textedit.h"
#include <QApplication> #include <QApplication>
@ -93,3 +77,11 @@ int main(int argc, char **argv)
//... //...
} }
//! [1] //! [1]
//! [2]
...
auto proxy = new MyProxyStyle(QApplication::style()->name());
proxy->setParent(widget); // take ownership to avoid memleak
widget->setStyle(proxy);
...
//! [2]

View File

@ -72,6 +72,13 @@ QT_BEGIN_NAMESPACE
or system controlled styles. It would not work on a Mac, for or system controlled styles. It would not work on a Mac, for
example, where menus are handled by the operating system. 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 \sa QStyle
*/ */

View File

@ -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. Initializes the appearance of the given \a widget.

View File

@ -73,6 +73,8 @@ public:
QStyle(); QStyle();
virtual ~QStyle(); virtual ~QStyle();
QString name() const;
virtual void polish(QWidget *widget); virtual void polish(QWidget *widget);
virtual void unpolish(QWidget *widget); virtual void unpolish(QWidget *widget);
@ -854,6 +856,9 @@ public:
const QStyle * proxy() const; const QStyle * proxy() const;
private:
void setName(const QString &name);
private: private:
Q_DISABLE_COPY(QStyle) Q_DISABLE_COPY(QStyle)
friend class QWidget; friend class QWidget;
@ -861,6 +866,7 @@ private:
friend class QApplication; friend class QApplication;
friend class QProxyStyle; friend class QProxyStyle;
friend class QProxyStylePrivate; friend class QProxyStylePrivate;
friend class QStyleFactory;
void setProxy(QStyle *style); void setProxy(QStyle *style);
}; };

View File

@ -72,6 +72,7 @@ public:
mutable int layoutSpacingIndex; mutable int layoutSpacingIndex;
QStyle *proxyStyle; QStyle *proxyStyle;
QString name;
}; };
inline QImage styleCacheImage(const QSize &size) inline QImage styleCacheImage(const QSize &size)

View File

@ -109,8 +109,10 @@ QStyle *QStyleFactory::create(const QString& key)
{ } // Keep these here - they make the #ifdefery above work { } // Keep these here - they make the #ifdefery above work
if (!ret) if (!ret)
ret = qLoadPlugin<QStyle, QStylePlugin>(loader(), style); ret = qLoadPlugin<QStyle, QStylePlugin>(loader(), style);
if (ret) if (ret) {
ret->setObjectName(style); ret->setObjectName(style);
ret->setName(style);
}
return ret; return ret;
} }