Remove the style plugin example

The snippets in the QStylePlugin class documentation show the
relevant bits well enough.

Pick-to: 6.7 6.6
Fixes: QTBUG-119974
Change-Id: Iba4a37664d64d86a2946f41d131a201ccdcd723b
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
This commit is contained in:
Volker Hilsheimer 2023-12-21 11:00:33 +01:00
parent f83e14b13a
commit 5a0135fafb
18 changed files with 0 additions and 423 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,133 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
/*!
\example tools/styleplugin
\title Style Plugin Example
\examplecategory {User Interface Components}
\ingroup examples-widgets-tools
\brief This example shows how to create a plugin that extends Qt with a new
GUI look and feel.
\image stylepluginexample.png
A plugin in Qt is a class stored in a shared library that can be
loaded by a QPluginLoader at run-time. When you create plugins in
Qt, they either extend a Qt application or Qt itself. Writing a
plugin that extends Qt itself is achieved by inheriting one of the
plugin \l{Plugin Classes}{base classes}, reimplementing functions
from that class, and adding a macro. In this example we extend Qt
by adding a new GUI look and feel (i.e., making a new QStyle
available). A high-level introduction to plugins is given in the
plugin \l{How to Create Qt Plugins}{overview document}.
Plugins that provide new styles inherit the QStylePlugin base
class. Style plugins are loaded by Qt and made available through
QStyleFactory; we will look at this later. We have implemented \c
SimpleStylePlugin, which provides \c SimpleStyle. The new style
contributes to widget styling by changing the text color of the
text edit widget to red - not a major contribution, but it still
makes a new style.
The new style is platform agnostic in the sense that it is not
based on any specific style implementation, but uses QProxyStyle
to merely tweak the looks in the current application style that
defaults to the native system style.
\note On some platforms, the native style may overwrite some custom
stylings, e.g., button background color. In that case, try to run
your application in another style (e.g., fusion). You may do this
by passing \c{-style fusion} as a command line argument to your
application.
We test the plugin with \c StyleWindow, in which we display a
QTextEdit. The \c SimpleStyle and \c StyleWindow classes do not
contain any plugin specific functionality and their implementations
are trivial; we will therefore leap past them and head on to the \c
SimpleStylePlugin and the \c main() function. After we have looked
at that, we examine the plugin's \c{.pro} file.
\section1 SimpleStylePlugin Class Definition
\c SimpleStylePlugin inherits QStylePlugin and is the plugin
class.
\snippet tools/styleplugin/plugin/simplestyleplugin.h 0
\c keys() returns a list of style names that this plugin can
create, while \c create() takes such a string and returns the
QStyle corresponding to the key. Both functions are pure virtual
functions reimplemented from QStylePlugin. When an application
requests an instance of the \c SimpleStyle style, which this
plugin creates, Qt will create it with this plugin.
\section1 SimpleStylePlugin Class Implementation
Here is the implementation of \c keys():
\snippet tools/styleplugin/plugin/simplestyleplugin.cpp 0
Since this plugin only supports one style, we return a QStringList
with the class name of that style.
Here is the \c create() function:
\snippet tools/styleplugin/plugin/simplestyleplugin.cpp 1
Note that the key for style plugins are case insensitive.
The case sensitivity varies from plugin to plugin, so you need to
check this when implementing new plugins.
\section1 The \c main() function
\snippet tools/styleplugin/stylewindow/main.cpp 0
Qt loads the available style plugins when the QApplication object
is initialized. The QStyleFactory class knows about all styles and
produces them with \l{QStyleFactory::}{create()} (it is a
wrapper around all the style plugins).
\section1 The Simple Style Plugin's QMake Project File
The \c SimpleStylePlugin lives in its own directory and has
its own \c{.pro} file:
\snippet tools/styleplugin/plugin/plugin.pro 0
In the plugin \c{.pro} file we need to set the lib template as we are
building a shared library instead of an executable. We must also
set the config to plugin. We set the library to be stored in the
\c{styles} folder next to the main executable because this is a path
in which Qt will search for style plugins.
\section2 Using CMake to Set up the Simple Style Plugin
When using CMake, we use \l{qt6_add_plugin}{qt_add_plugin}
to create the \c simplestyleplugin plugin:
\snippet tools/styleplugin/plugin/CMakeLists.txt 0
On Windows and Linux, we place the plugin into the \c{styles} folder
next to the main executable, i.e., \c{styleplugin.exe}:
\snippet tools/styleplugin/plugin/CMakeLists.txt 2
And on macOS, we store the \c simplestyleplugin into the
\c{Contents/PlugIns/styles} folder of the App Bundle.
\snippet tools/styleplugin/plugin/CMakeLists.txt 1
\note On macOS, when creating an App Bundle, store the plugins in
the \c PlugIns folder and not next to the main executable in
the \c MacOS folder as the latter will cause issues during signing
and distribution of the app.
\section1 Related Articles and Examples
In addition to the plugin \l{How to Create Qt Plugins}{overview
document}, we have other examples and articles that concern
plugins.
*/

View File

@ -4,6 +4,5 @@
qt_internal_add_example(completer)
qt_internal_add_example(customcompleter)
qt_internal_add_example(regularexpression)
qt_internal_add_example(styleplugin)
qt_internal_add_example(treemodelcompleter)
qt_internal_add_example(undoframework)

View File

@ -1,18 +0,0 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
cmake_minimum_required(VERSION 3.16)
project(styleplugin LANGUAGES CXX)
if(NOT DEFINED INSTALL_EXAMPLESDIR)
set(INSTALL_EXAMPLESDIR "examples")
endif()
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/tools/styleplugin")
find_package(Qt6 REQUIRED COMPONENTS Widgets)
qt_standard_project_setup()
add_subdirectory(stylewindow)
add_subdirectory(plugin)

View File

@ -1,41 +0,0 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
#! [0]
qt_add_plugin(simplestyleplugin
CLASS_NAME SimpleStylePlugin
simplestyle.cpp simplestyle.h
simplestyleplugin.cpp simplestyleplugin.h
)
#! [0]
if(QT_FEATURE_debug AND APPLE)
set_property(TARGET simplestyleplugin
APPEND_STRING PROPERTY OUTPUT_NAME "_debug")
endif()
get_target_property(is_bundle styleplugin MACOSX_BUNDLE)
if(APPLE AND is_bundle)
#! [1]
set_target_properties(simplestyleplugin PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "$<TARGET_BUNDLE_CONTENT_DIR:styleplugin>/PlugIns/styles"
)
#! [1]
else()
#! [2]
set_target_properties(simplestyleplugin PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "$<TARGET_FILE_DIR:styleplugin>/styles"
)
#! [2]
endif()
target_link_libraries(simplestyleplugin PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)
install(TARGETS simplestyleplugin
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,34 +0,0 @@
#! [0]
TEMPLATE = lib
CONFIG += plugin
QT += widgets
HEADERS = simplestyle.h \
simplestyleplugin.h
SOURCES = simplestyle.cpp \
simplestyleplugin.cpp
TARGET = simplestyleplugin
#! [0]
win32 {
CONFIG(debug, release|debug):DESTDIR = ../debug/styles/
CONFIG(release, release|debug):DESTDIR = ../release/styles/
} else {
macos {
# The non-app-bundle case is not supported with qmake, because
# the plugin project cannot know whether the app is built
# as a bundle or not.
DESTDIR = ../styleplugin.app/Contents/PlugIns/styles/
contains(QT_CONFIG, debug) {
TARGET = $$join(TARGET,,,_debug)
}
} else {
DESTDIR = ../styles/
}
}
EXAMPLE_FILES += simplestyle.json
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/styleplugin/styles
INSTALLS += target
CONFIG += install_ok # Do not cargo-cult this!

View File

@ -1,9 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "simplestyle.h"
void SimpleStyle::polish(QPalette &palette)
{
palette.setBrush(QPalette::Text, Qt::red);
}

View File

@ -1,19 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef SIMPLESTYLE_H
#define SIMPLESTYLE_H
#include <QProxyStyle>
class SimpleStyle : public QProxyStyle
{
Q_OBJECT
public:
SimpleStyle() = default;
void polish(QPalette &palette) override;
};
#endif

View File

@ -1,3 +0,0 @@
{
"Keys": [ "simplestyle" ]
}

View File

@ -1,21 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include "simplestyleplugin.h"
#include "simplestyle.h"
//! [0]
QStringList SimpleStylePlugin::keys() const
{
return {"SimpleStyle"};
}
//! [0]
//! [1]
QStyle *SimpleStylePlugin::create(const QString &key)
{
if (key.toLower() == "simplestyle")
return new SimpleStyle;
return nullptr;
}
//! [1]

View File

@ -1,23 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef SIMPLESTYLEPLUGIN_H
#define SIMPLESTYLEPLUGIN_H
#include <QStylePlugin>
//! [0]
class SimpleStylePlugin : public QStylePlugin
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "simplestyle.json")
public:
SimpleStylePlugin() = default;
QStringList keys() const;
QStyle *create(const QString &key) override;
};
//! [0]
#endif

View File

@ -1,3 +0,0 @@
TEMPLATE = subdirs
SUBDIRS = stylewindow \
plugin

View File

@ -1,30 +0,0 @@
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
qt_add_executable(styleplugin
main.cpp
stylewindow.cpp stylewindow.h
)
set_target_properties(styleplugin PROPERTIES
WIN32_EXECUTABLE TRUE
MACOSX_BUNDLE TRUE
)
target_link_libraries(styleplugin PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
)
if(NOT QT6_IS_SHARED_LIBS_BUILD)
target_link_libraries(styleplugin PRIVATE
simplestyleplugin
)
endif()
install(TARGETS styleplugin
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

View File

@ -1,26 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QApplication>
#include <QStyleFactory>
#include "stylewindow.h"
//! [0]
int main(int argv, char *args[])
{
QApplication app(argv, args);
QStyle *style = QStyleFactory::create("simplestyle");
if (!style)
qFatal("Cannot load the 'simplestyle' plugin.");
QApplication::setStyle(style);
StyleWindow window;
window.resize(350, 50);
window.show();
return app.exec();
}
//! [0]

View File

@ -1,25 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#include <QGridLayout>
#include <QGroupBox>
#include <QTextEdit>
#include "stylewindow.h"
StyleWindow::StyleWindow()
{
QTextEdit *styledTextEdit = new QTextEdit(tr("The quick brown fox jumps over the lazy dog"));
QGridLayout *layout = new QGridLayout;
layout->addWidget(styledTextEdit);
QGroupBox *styleBox = new QGroupBox(tr("A simple styled text edit"));
styleBox->setLayout(layout);
QGridLayout *outerLayout = new QGridLayout;
outerLayout->addWidget(styleBox, 0, 0);
setLayout(outerLayout);
setWindowTitle(tr("Style Plugin Example"));
}

View File

@ -1,17 +0,0 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
#ifndef STYLEWINDOW_H
#define STYLEWINDOW_H
#include <QWidget>
class StyleWindow : public QWidget
{
Q_OBJECT
public:
StyleWindow();
};
#endif

View File

@ -1,19 +0,0 @@
QT += widgets
HEADERS = stylewindow.h
SOURCES = stylewindow.cpp \
main.cpp
TARGET = styleplugin
win32 {
debug:DESTDIR = ../debug/
release:DESTDIR = ../release/
} else {
DESTDIR = ../
}
# install
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/tools/styleplugin
INSTALLS += target
CONFIG += install_ok # Do not cargo-cult this!

View File

@ -3,7 +3,6 @@ SUBDIRS = \
completer \
customcompleter \
regularexpression \
styleplugin \
treemodelcompleter \
undoframework