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
|
||||
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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -5,5 +5,5 @@
|
||||
|
||||
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[])
|
||||
{
|
||||
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();
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user