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:
Amir Masoud Abdol 2022-12-08 14:56:15 +01:00
parent b171abe695
commit 7fe2537ce2
7 changed files with 77 additions and 19 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -25,20 +25,23 @@
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 drawing button backgrounds in
red - not a major contribution, but it still makes a 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 will prevent the button
from having a red background. In this case, try to run the example
in another style (e.g., fusion).
\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
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
are trivial; we will therefore leap past them and head on to the \c
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
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
styles folder under stylewindow because this is a path in which Qt
will search for style plugins.
\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

View File

@ -1,15 +1,33 @@
# 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]
set_target_properties(simplestyleplugin PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/stylewindow/styles"
)
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
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

View File

@ -12,7 +12,17 @@ win32 {
CONFIG(debug, release|debug):DESTDIR = ../debug/styles/
CONFIG(release, release|debug):DESTDIR = ../release/styles/
} else {
DESTDIR = ../styles/
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

View File

@ -5,5 +5,5 @@
void SimpleStyle::polish(QPalette &palette)
{
palette.setBrush(QPalette::Button, Qt::red);
palette.setBrush(QPalette::Text, Qt::red);
}

View File

@ -10,10 +10,15 @@
int main(int argv, char *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;
window.resize(200, 50);
window.resize(350, 50);
window.show();
return app.exec();

View File

@ -3,18 +3,18 @@
#include <QGridLayout>
#include <QGroupBox>
#include <QPushButton>
#include <QTextEdit>
#include "stylewindow.h"
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;
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);
QGridLayout *outerLayout = new QGridLayout;