Fix Style Plugin Example, and add some CMake Docs
A few things: - Improved the documentation by adding a CMake section, briefly describing the process of adding the plugin, and placing it where it should be. - Write a note about the case where the style may be overwritten at launch, and how to set the a new style using a CLI - Improved the CMake build such that it creates the App Bundle correctly, and also works without an App Bundle as well. - Changed the example, and plugin such that now instead of a QPushButton we have a QTextEdit, and change the text color. - Replaced the application screenshot Fixes: QTBUG-107842 Fixes: QTBUG-109227 Change-Id: I161a91b27df016ff6230fac3871b79d2dfbdf18a Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
parent
b171abe695
commit
7fe2537ce2
Binary file not shown.
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 15 KiB |
@ -25,20 +25,23 @@
|
|||||||
class. Style plugins are loaded by Qt and made available through
|
class. Style plugins are loaded by Qt and made available through
|
||||||
QStyleFactory; we will look at this later. We have implemented \c
|
QStyleFactory; we will look at this later. We have implemented \c
|
||||||
SimpleStylePlugin, which provides \c SimpleStyle. The new style
|
SimpleStylePlugin, which provides \c SimpleStyle. The new style
|
||||||
contributes to widget styling by drawing button backgrounds in
|
contributes to widget styling by changing the text color of the
|
||||||
red - not a major contribution, but it still makes a new style.
|
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
|
The new style is platform agnostic in the sense that it is not
|
||||||
based on any specific style implementation, but uses QProxyStyle
|
based on any specific style implementation, but uses QProxyStyle
|
||||||
to merely tweak the looks in the current application style that
|
to merely tweak the looks in the current application style that
|
||||||
defaults to the native system style.
|
defaults to the native system style.
|
||||||
|
|
||||||
\note On some platforms, the native style will prevent the button
|
\note On some platforms, the native style may overwrite some custom
|
||||||
from having a red background. In this case, try to run the example
|
stylings, e.g., button background color. In that case, try to run
|
||||||
in another style (e.g., fusion).
|
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
|
We test the plugin with \c StyleWindow, in which we display a
|
||||||
QPushButton. The \c SimpleStyle and \c StyleWindow classes do not
|
QTextEdit. The \c SimpleStyle and \c StyleWindow classes do not
|
||||||
contain any plugin specific functionality and their implementations
|
contain any plugin specific functionality and their implementations
|
||||||
are trivial; we will therefore leap past them and head on to the \c
|
are trivial; we will therefore leap past them and head on to the \c
|
||||||
SimpleStylePlugin and the \c main() function. After we have looked
|
SimpleStylePlugin and the \c main() function. After we have looked
|
||||||
@ -96,8 +99,30 @@
|
|||||||
In the plugin profile we need to set the lib template as we are
|
In the plugin profile we need to set the lib template as we are
|
||||||
building a shared library instead of an executable. We must also
|
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
|
set the config to plugin. We set the library to be stored in the
|
||||||
styles folder under stylewindow because this is a path in which Qt
|
\c{styles} folder next to the main executable because this is a path
|
||||||
will search for style plugins.
|
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
|
\section1 Related Articles and Examples
|
||||||
|
|
||||||
|
@ -1,15 +1,33 @@
|
|||||||
# Copyright (C) 2022 The Qt Company Ltd.
|
# Copyright (C) 2022 The Qt Company Ltd.
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
|
||||||
|
#! [0]
|
||||||
qt_add_plugin(simplestyleplugin
|
qt_add_plugin(simplestyleplugin
|
||||||
CLASS_NAME SimpleStylePlugin
|
CLASS_NAME SimpleStylePlugin
|
||||||
simplestyle.cpp simplestyle.h
|
simplestyle.cpp simplestyle.h
|
||||||
simplestyleplugin.cpp simplestyleplugin.h
|
simplestyleplugin.cpp simplestyleplugin.h
|
||||||
)
|
)
|
||||||
|
#! [0]
|
||||||
|
|
||||||
|
if(QT_FEATURE_debug AND APPLE)
|
||||||
|
set_property(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
|
set_target_properties(simplestyleplugin PROPERTIES
|
||||||
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/stylewindow/styles"
|
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
|
target_link_libraries(simplestyleplugin PRIVATE
|
||||||
Qt6::Core
|
Qt6::Core
|
||||||
|
@ -11,9 +11,19 @@ TARGET = simplestyleplugin
|
|||||||
win32 {
|
win32 {
|
||||||
CONFIG(debug, release|debug):DESTDIR = ../debug/styles/
|
CONFIG(debug, release|debug):DESTDIR = ../debug/styles/
|
||||||
CONFIG(release, release|debug):DESTDIR = ../release/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 {
|
} else {
|
||||||
DESTDIR = ../styles/
|
DESTDIR = ../styles/
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EXAMPLE_FILES += simplestyle.json
|
EXAMPLE_FILES += simplestyle.json
|
||||||
|
|
||||||
|
@ -5,5 +5,5 @@
|
|||||||
|
|
||||||
void SimpleStyle::polish(QPalette &palette)
|
void SimpleStyle::polish(QPalette &palette)
|
||||||
{
|
{
|
||||||
palette.setBrush(QPalette::Button, Qt::red);
|
palette.setBrush(QPalette::Text, Qt::red);
|
||||||
}
|
}
|
||||||
|
@ -10,10 +10,15 @@
|
|||||||
int main(int argv, char *args[])
|
int main(int argv, char *args[])
|
||||||
{
|
{
|
||||||
QApplication app(argv, args);
|
QApplication app(argv, args);
|
||||||
QApplication::setStyle(QStyleFactory::create("simplestyle"));
|
|
||||||
|
QStyle *style = QStyleFactory::create("simplestyle");
|
||||||
|
if (!style)
|
||||||
|
qFatal("Cannot load the 'simplestyle' plugin.");
|
||||||
|
|
||||||
|
QApplication::setStyle(style);
|
||||||
|
|
||||||
StyleWindow window;
|
StyleWindow window;
|
||||||
window.resize(200, 50);
|
window.resize(350, 50);
|
||||||
window.show();
|
window.show();
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
|
@ -3,18 +3,18 @@
|
|||||||
|
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
#include <QPushButton>
|
#include <QTextEdit>
|
||||||
|
|
||||||
#include "stylewindow.h"
|
#include "stylewindow.h"
|
||||||
|
|
||||||
StyleWindow::StyleWindow()
|
StyleWindow::StyleWindow()
|
||||||
{
|
{
|
||||||
QPushButton *styledButton = new QPushButton(tr("Big Red Button"));
|
QTextEdit *styledTextEdit = new QTextEdit(tr("The quick brown fox jumps over the lazy dog"));
|
||||||
|
|
||||||
QGridLayout *layout = new QGridLayout;
|
QGridLayout *layout = new QGridLayout;
|
||||||
layout->addWidget(styledButton);
|
layout->addWidget(styledTextEdit);
|
||||||
|
|
||||||
QGroupBox *styleBox = new QGroupBox(tr("A simple style button"));
|
QGroupBox *styleBox = new QGroupBox(tr("A simple styled text edit"));
|
||||||
styleBox->setLayout(layout);
|
styleBox->setLayout(layout);
|
||||||
|
|
||||||
QGridLayout *outerLayout = new QGridLayout;
|
QGridLayout *outerLayout = new QGridLayout;
|
||||||
|
Loading…
Reference in New Issue
Block a user