Giter Club home page Giter Club logo

breezestylesheets's Introduction

BreezeStyleSheets

Configurable Breeze and BreezeDark-like stylesheets for Qt Applications.

BreezeStyleSheets is a set of beautiful light and dark stylesheets that render consistently across platforms, including high DPI screens. Each stylesheet is generated from a theme file and can be extended with a extension system, simplifying the generation custom stylesheets for your application. The stylesheets are comprehensively tested with most Qt widgets and widget properties, providing a consistent, stylish feel on any platform, including different operating systems, desktop environments, and Qt versions.

Table of Contents

Gallery

Breeze/BreezeDark

Example user interface using the Breeze and BreezeDark stylesheets side-by-side.

BreezeDark

For an extensive view of screenshots of the theme, see the gallery.

Customization

It's easy to design your own themes using configure.py. First, add the styles you want into theme, then run configure with a list of styles you want to include.

Theme

Here is a sample theme, with the color descriptions annotated. Please note that although there are nearly 40 possibilities, for most applications, you should use less than 20, and ~10 different hues.

// NOTE: This is a custom JSON file, where lines leading
// with `//` are removed. No other comments are valid.
{
    // Main foreground color.
    "foreground": "#eff0f1",
    // Lighter foreground color for selected items.
    "foreground-light": "#ffffff",
    // Main background color.
    "background": "#31363b",
    // Alternate background color for styles.
    "background:alternate": "#31363b",
    // Main color to highlight widgets, such as on hover events.
    "highlight": "#3daee9",
    // Color for selected widgets so hover events can change widget color.
    "highlight:dark": "#2a79a3",
    // Alternate highlight color for hovered widgets in QAbstractItemViews.
    "highlight:alternate": "#369cd1",
    // Main midtone color, such as for borders.
    "midtone": "#76797c",
    // Lighter color for midtones, such as for certain disabled widgets.
    "midtone:light": "#b0b0b0",
    // Darker midtone, such as for the background of QPushButton and QSlider.
    "midtone:dark": "#626568",
    // Lighter midtone for separator hover events.
    "midtone:hover": "#8a8d8f",
    // Color for checked widgets in QAbstractItemViews.
    "view:checked": "#334e5e",
    // Hover background color in QAbstractItemViews.
    // This should be fairly transparent.
    "view:hover": "rgba(61, 173, 232, 0.1)",
    // Background for a horizontal QToolBar.
    "toolbar:horizontal:background": "#31363b",
    // Background for a vertical QToolBar.
    "toolbar:vertical:background": "#31363b",
    // Background color for the corner widget in a QAbstractItemView.
    "view:corner": "#31363b",
    // Border color between items in a QHeaderView.
    "view:header:border": "#76797c",
    // Background color for a QHeaderView.
    "view:header": "#31363b",
    // Border color Between items in a QAbstractItemView.
    "view:border": "#31363b",
    // Background for QAbstractItemViews.
    "view:background": "#1d2023",
    // Background for widgets with text input.
    "text:background": "#1d2023",
    // Background for the currently selected tab.
    "tab:background:selected": "#31363b",
    // Background for non-selected tabs.
    "tab:background": "#2c3034",
    // Color for the branch/arrow icons in a QTreeView.
    "tree": "#afafaf",
    // Color for the chunk of a QProgressBar, the active groove
    // of a QSlider, and the border of a hovered QSlider handle.
    "slider:foreground": "#3daee9",
    // Background color for the handle of a QSlider.
    "slider:handle:background": "#1d2023",
    // Color for a disabled menubar/menu item.
    "menu:disabled": "#76797c",
    // Color for a checked/hovered QCheckBox or QRadioButton.
    "checkbox:light": "#58d3ff",
    // Color for a disabled or unchecked/unhovered QCheckBox or QRadioButton.
    "checkbox:disabled": "#c8c9ca",
    // Color for the handle of a scrollbar. Due to limitations of 
    // Qt stylesheets, any handle of a scrollbar must be treated
    // like it's hovered.
    "scrollbar:hover": "#3daee9",
    // Background for a non-hovered scrollbar.
    "scrollbar:background": "#1d2023",
    // Background for a hovered scrollbar.
    "scrollbar:background:hover": "#76797c",
    // Default background for a QPushButton.
    "button:background": "#31363b",
    // Background for a pressed QPushButton.
    "button:background:pressed": "#454a4f",
    // Border for a non-hovered QPushButton.
    "button:border": "#76797c",
    // Background for a disabled QPushButton, or fallthrough
    // for disabled QWidgets.
    "button:disabled": "#454545",
    // Color of a dock/tab close icon when hovered.
    "close:hover": "#b37979",
    // Color of a dock/tab close icon when pressed.
    "close:pressed": "#b33e3e",
    // Default background color for QDockWidget and title.
    "dock:background": "#31363b",
    // Color for the float icon for QDockWidgets.
    "dock:float": "#a2a2a2",
    // Background color for the QMessageBox critical icon.
    "critical": "#80404a",
    // Background color for the QMessageBox information icon.
    "information": "#406880",
    // Background color for the QMessageBox question icon.
    "question": "#634d80",
    // Background color for the QMessageBox warning icon.
    "warning": "#99995C"
}

Once you've saved your custom theme, you can then build the stylesheet, icons, and resource file with:

python configure.py --styles=dark,light,<custom> --resource custom.qrc

Then, you can use custom.qrc, along with the generated icons and stylesheets in each folder, in place of breeze.qrc for any style.

The --styles command flag takes a comma-separated list of values, or all, which will configure every theme present in the themes directory.

Generating Colors

As a reference point, see the pre-generated themes. In general, to create a good theme, modify only the highlight colors (blues, greens, purples) to a new color, such that the saturation and lightness stay the same (only the hue changes). For example, the color rgba(51, 164, 223, 0.5) becomes rgba(164, 51, 223, 0.5).

Extensions

We also allow customizable extensions to extend the default stylesheets with additional style rules, using the colors defined in your theme. This also enables the integration of third-party Qt extensions/widgets into the generated stylesheets.

For example, to configure with extensions for the Advanced Docking System, run:

python configure.py --extensions=advanced-docking-system --resource custom.qrc

Like with styles, --extensions takes a comma-separated list of values, or all, which will add every extension present in the extensions directory. For a detailed introduction to creating your own extensions, see the extensions tutorial.

Features

  • Complete stylesheet for all Qt widgets, including esoteric widgets like QCalendarWidget.
  • Customizable, beautiful light and dark themes.
  • Cross-platform icon packs for standard icons.
  • Extensible stylesheets: add your own extensions or rules and automatically configure them using the same configuration syntax.

Extensions

The supported extensions can be found in the extensions directory and include theme support for:

Extending Stylesheets

There are some limitations of using Qt stylesheets in general, which cannot be solved by stylesheets. To get more fine-grained style control, you should subclass QCommonStyle:

class ApplicationStyle: public QCommonStyle
{
    ...
}

The limitations of stylesheets include:

  • Using custom standard icons.
  • Scaling icons with the theme size.
  • QToolButton cannot control the icon size without also affecting the arrow size.
  • Close and dock float icon sizes scale poorly with font size.

For an example of using QCommonStyle to override standard icons in a PyQt application, see standard_icons.py. An extensive reference can be found here. A reference of QStyle, and the default styles Qt provides can be found here.

Installing

Here are detailed instructions on how to install Breeze Style Sheets for a variety of build systems and programming languages.

Configuring

By default, BreezeStyleSheets comes with the dark and light themes pre-built. In order to build all pre-packaged themes including PyQt5 and PyQt6 support, run:

python configure.py --styles=all --extensions=all --pyqt6 \
    --resource breeze.qrc --compiled-resource breeze_resources.py

All generated themes will be in the dist subdirectory, and the compiled Python resource will be in breeze_resouces.py. Note that using the --compiled-resource flag requires pyrcc5 to be installed.

CMake Installation

Using CMake, you can download, configure, and compile the resources as part part of the build process. The following configurations are provided by @ruilvo. First, save the following as BreezeThemes.cmake

# Setup Qt: this works with both Qt5 and Qt6
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(
  QT NAMES Qt6 Qt5
  COMPONENTS Core
  REQUIRED)
find_package(
  Qt${QT_VERSION_MAJOR}
  COMPONENTS ${AE_REQUIRED_QT_COMPONENTS}
  REQUIRED)
# -------------------

# Get Python to compile the stylesheets.
# Fetch the repository, configure, compile the stylesheets.
find_package(Python COMPONENTS Interpreter)

include(FetchContent)

set(FETCHCONTENT_QUIET
    OFF
    CACHE BOOL "Silence fetch content" FORCE)

FetchContent_Declare(
  breeze_stylesheets
  GIT_REPOSITORY https://github.com/Alexhuszagh/BreezeStyleSheets.git
  GIT_TAG origin/main
  GIT_PROGRESS ON
  USES_TERMINAL_DOWNLOAD TRUE)

FetchContent_GetProperties(breeze_stylesheets)
if(NOT breeze_stylesheets_POPULATED)
  FetchContent_Populate(breeze_stylesheets)

  add_library(breeze_themes STATIC "${breeze_stylesheets_SOURCE_DIR}/dist/qrc/breeze.qrc")

  add_custom_target(
    run_python_breeze ALL
    COMMAND ${Python_EXECUTABLE} configure.py --extensions=<EXTENSIONS>
            --styles=<STYLES> --resource breeze.qrc
    WORKING_DIRECTORY ${breeze_stylesheets_SOURCE_DIR}
    BYPRODUCTS "${breeze_stylesheets_SOURCE_DIR}/dist/qrc/breeze.qrc"
    COMMENT "Generating themes")

  add_dependencies(breeze_themes run_python_breeze)
endif()

Next, make sure the path to breeze_themes.cmake is in your module search path, and add the following to your CMakeLists.txt:

include(BreezeThemes)

add_executable(myapp WIN32 MACOSX_BUNDLE "main.cpp")
target_link_libraries(myapp PRIVATE Qt${QT_VERSION_MAJOR}::Widgets breeze_themes)

And then in your application start point, add the following:

int main()
{
    // ...
    QApplication app(argc, argv);

    // Need to initialize the resource, since we're using an external
    // build system and this isn't automatically handled by CMake.
    Q_INIT_RESOURCE(breeze_themes);
    QFile file(":/dark-green/stylesheet.qss");
    file.open(QFile::ReadOnly | QFile::Text);
    QTextStream stream(&file);
    app.setStyleSheet(stream.readAll());

    // ...
}

QMake Installation

Copy the contents of the dist/qrc subdirectory into your project directory and add the qrc file to your project file.

For example:

TARGET = app
SOURCES = main.cpp
RESOURCES = breeze.qrc

To load the stylesheet in C++, load the file using QFile and read the data. For example, to load BreezeDark, run:

#include <QApplication>
#include <QFile>
#include <QTextStream>


int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    // set stylesheet
    QFile file(":/dark/stylesheet.qss");
    file.open(QFile::ReadOnly | QFile::Text);
    QTextStream stream(&file);
    app.setStyleSheet(stream.readAll());

    // code goes here

    return app.exec();
}

PyQt5 Installation

To compile the stylesheet for use with PyQt5, ensure you configure with the --compiled-resource flag (which requires pyrcc5 installed). The compiled resource Python file now contains all the stylesheet data. To load and set the stylesheet in a PyQt5 application, import that file, load the contents using QFile and read the data. For example, to load BreezeDark, first configure using:

python configure.py --compiled-resource breeze_resources.py

Then load the stylesheet and run the application using:

from PyQt5 import QtWidgets
from PyQt5.QtCore import QFile, QTextStream
import breeze_resources


def main():
    app = QtWidgets.QApplication(sys.argv)

    # set stylesheet
    file = QFile(":/dark/stylesheet.qss")
    file.open(QFile.ReadOnly | QFile.Text)
    stream = QTextStream(file)
    app.setStyleSheet(stream.readAll())

    # code goes here

    app.exec_()

PyQt6 Installation

Since pyrcc is no longer being maintained, using local Python paths is the preferable solution. For a detailed description on how to package these resources, see this StackOverflow answer.

First, package your code using setuptools. Make sure zip_safe is off, so we can properly load the files from a search path, and include the necessary package directories to your MANIFEST.in file.

from setuptools import setup

setup(
    # Either option is valid here.
    #   Either use `package_data` with enumerating the values, or
    #   set `include_package_data=True`.
    include_package_data=True,
    package_data={
        'breeze_theme': ['dist/pyqt6/*'],
    },
    zip_safe=False,
)

Then, you can import the resources as follows:

import importlib.resources
from Qt6 import QtWidgets, QtCore
from Qt6.QtCore import QFile, QTextStream


def main():
    app = QtWidgets.QApplication(sys.argv)

    # set stylesheet
    # Note that the search path name must be the theme name.
    #   dark => dark, light => light, dark-purple => dark-purple, ...
    breeze_theme = importlib_resources.files('breeze_theme.dark')
    QtCore.QDir.addSearchPath('dark', breeze_theme)
    file = QFile("dark:stylesheet.qss")
    file.open(QFile.OpenModeFlag.ReadOnly | QFile.OpenModeFlag.Text)
    stream = QTextStream(file)
    app.setStyleSheet(stream.readAll())

    # code goes here

    app.exec()

Debugging

Have an issue with the styles? Here's a few suggestions, prior to filing a bug report:

  • Modified the application font? Make sure you do before setting the application stylesheet.
  • Modified the application style? Make sure you do after you creating a QApplication instance but before you show the window or add widgets.

Development Guide

Configuring

To configure the assets and the stylesheets, run python configure.py. To compile the assets and stylesheets for PyQt5, ensure pyrcc5 is installed and run:

python configure.py --compiled-resource breeze_resources.py

Testing

The unittest suite is ui.py. By default, the suite runs every test, so to test changes to a specific widget, pass the --widget $widget flag. To test other configurations, see the options for --stylesheet, --widget, --font-size, and --font-family, and then run the tests with the complete UI in widgets.py. If the widget you fixed the style for does not exist in the test suite or widgets.py, please add it.

# Test all widgets
$ python test/ui.py --stylesheet $theme
# Test only a single widget.
$ python test/ui.py --widget $widget --stylesheet $theme
# Get the help options.
$ python test/ui.py --help
usage: ui.py [-h] [--widget WIDGET] [--stylesheet STYLESHEET] [--style STYLE]
             [--font-size FONT_SIZE] [--font-family FONT_FAMILY] [--width WIDTH]
             [--height HEIGHT] [--alignment ALIGNMENT] [--compress] [--scale SCALE] [--pyqt6]
             [--use-x11]

Configurations for the Qt application.

options:
  -h, --help            show this help message and exit
  --widget WIDGET       widget to test. can provide `all` to test all widgets
  --stylesheet STYLESHEET
                        stylesheet name (`dark`, `light`, `native`, ...)
  --style STYLE         application style (`Fusion`, `Windows`, `native`, ...)
  --font-size FONT_SIZE
                        font size for the application
  --font-family FONT_FAMILY
                        the font family
  --width WIDTH         the window width
  --height HEIGHT       the window height
  --alignment ALIGNMENT
                        the layout alignment
  --compress            add stretch on both sides
  --scale SCALE         scale factor for the UI
  --pyqt6               use PyQt6 rather than PyQt5.
  --use-x11             force the use of x11 on compatible systems
  --print-tests         print all available tests (widget names).
# Get a complete list of available tests.
$ python test/ui.py --print-tests
aero_wizard                                                                                     
all_focus_tree                                                                                  
alpha_colordialog
...
wizard
yes_button

To see the complete list of Qt widgets covered by the unittests, see Test Coverage.

Distribution Files

When pushing changes, only the light and dark themes should be configured, without any extensions. To reset the built resource files to the defaults (this requires pyrcc5 to be installed), run:

python configure.py --clean --pyqt6 \
    --compiled-resource breeze_resources.py

If no changes are being made to the icons or stylesheets, you may want to ensure that the dist directory is assumed to be unchanged in git, no longer tracking changes to these files. You can turn tracking distribution files off with:

python vcs.py --no-track-dist

To turn back on tracking, run:

python vcs.py --track-dist

Git Ignore

Note that the .gitignore is auto-generated via vcs.py, and the scripts to track or untrack distribution files turn off .gitignore tracking. Any changes should be made in vcs.py, and ensure that .gitignore is tracked, and commit any changes:

python vcs.py --track-gitignore
git add .gitignore
git commit -m "..."

Known Issues and Workarounds

For known issues and workarounds, see issues.

License

MIT, see license.

Contributing

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in BreezeStyleSheets by you shall be licensed under the MIT license without any additional terms or conditions.

Acknowledgements

BreezeStyleSheets is a fork of QDarkStyleSheet. Some of the icons are modified from Material UI and Material Design Icons (both of which use an Apache 2.0 license), and are redistributed under the MIT license.

Contact

Email: [email protected]
Twitter: KardOnIce

breezestylesheets's People

Contributors

alexhuszagh avatar chaosink avatar eblade avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

breezestylesheets's Issues

Bug Using Test Suite with Default Settings

Description

Running the test suite currently raises an error of an invalid widget type if called without using --widget all. This should be the default.

$ python3 test/ui.py
Traceback (most recent call last):
  File "/home/ahuszagh/git/BreezeStyleSheets/test/ui.py", line 963, in test
    function = globals()[f'test_{test_widget}']
KeyError: 'test_None'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/ahuszagh/git/BreezeStyleSheets/test/ui.py", line 1031, in <module>
    sys.exit(main())
  File "/home/ahuszagh/git/BreezeStyleSheets/test/ui.py", line 1026, in main
    test(args, sys.argv[:1] + unknown, args.widget)
  File "/home/ahuszagh/git/BreezeStyleSheets/test/ui.py", line 965, in test
    raise NotImplementedError(f'test for {test_widget} not implemented')
NotImplementedError: test for None not implemented

Question: compiling and adding to project

I may want to add this to a project I am working on and have a question on this;
The readme says to compile the style sheets to use them. Does that mean that every user of the project need to compile the dark theme or when does this happen?

If the theme needs to be compiled every time, is there a trick to have this be done automagically on the first time the software runs?

[FEATURE] Add Complete Standard Icon Pack

Problem

For applications that wish to override all standard icons to fit with the BreezeStyleSheets theme, we currently do not provide a complete icon set.

Solution

This could be provided as an extension, with SVG icons provided for all standard icons.

Missing Icons in Test Suite

Description

Running the test suite with all widgets produces the following error messages:

qt.svg: Cannot open file ':/native/close.svg', because: No such file or directory
qt.svg: Cannot open file ':/native/close.svg', because: No such file or director

[BUG] Placeholder Text in QLineEdit Not Greyed Out

Description

Normally, placeholder text when a text edit is empty should have a different display color than the regular text. However, QLineEdit does not have this currently, incorrectly showing it as the same display color. This also affects editable QComboxes.

Screenshot_20220429_235852

Move Configured Templates to `dist`

Issue

Configured files should be isolated from the remaining project files, and all exist under dist/. PyQt6 uses a different resource system than PyQt5 and C++ Qt, so these should have different subdirectories since both the light and dark themes without extensions for both resources should be tracked by Git.

Checkbox not shown in dark mode

When using the dark stylesheet, checkboxes are not displayed properly. Only the test is visible. See attached images comparing the default Qt stylesheet versus the dark stylesheet.

Qt 6.2.2 with C++ in Visual Studio 2022 with Qt Visual Studio Tools version 2.8.1 (rev.6)

image

image

[BUG] QColumnView Has Border When not Focused

Description

When not focused, a QColumnView has a border around it. It should potentially have a highlight border when hovered/selected, but it should not have a border when not focused.
QColumnView

UI File

Where can I find the ui file

Overhaul Windows UI

Right now, there's a few issues that lead to massive issues with the Windows UI. This will be a status update, with incremental fixes being displayed.

QHeaderView Sections not Properly Padded in Qt6

Issue

Using text-align: center;, the sections are still incorrectly padded on the bottom (for vertical elements) and on the right (for horizontal elements). This only occurs in Qt6.

Qt6

Screenshot_20220429_090553

Qt5

Screenshot_20220429_090739

This also affects the solution for #35.

[BUG] No Hover Event for QCompleter in Qt5

Description

There is no hover event properly highlighting the selected element in a QCompleter in Qt5 (works in Qt6). Right here, "Fruits Basket" is hovered, but there's no highlight event.

Completer

No breeze.py

dark.py and light.py need breeze.py which doesn't exist.

And, app->setStyleSheet() should be app.setStyleSheet().

Unexpected Table Item Padding in PyQt6

Issue

Using PyQt6, the table items/headers have unexpected padding under the elements, which means with the default item sizes they are practically illegible. This differs friom both the native theme and PyQt5.

PyQt6 Dark

Padding Dark

PyQt5 Dark

Padding Dark Qt5

PyQt6 Native

Padding Native

[BUG] QSlider Ticks Invisible

Description

The ticks for a QSlider widget are the same color as the background in both the light and dark themes.

Screenshot_20220430_092115

[BUG] QColumnView Size Grip Expands View

Description

Hovering over the size grips in a QColumnView expands the widget, and does not trigger the size grips correctly. Dissecting the issue, I've found the offending commit is the patch for #11, specifically, d620f22, and the offending code is:

QWidget:disabled:hover
{
    background-color: ^background^;
}

Removing this fixes the issue, however, it might cause ripple effects.

Disabled menu can't be seen completely in dark theme

Hi

I like how light theme behave. The disabled menu/button still appear and readable but can't be selected/highlighted. In contrary, those menu/button in dark theme completely unreadable

company

company1

is this expected behavior ?

Thanks for Breeze

Consider supporting githubuser0xFFFF/Qt-Advanced-Docking-System

Hello

The advanced docking system is really a great docking system for Qt. It uses an internal stylesheet to make it look like this:

imagem

When trying to use the stylesheet provided here without any changes, this happens:

imagem

What happens is that Qt-ADS uses an internal stylesheet to keep things in order.

If the internal stylesheet is disabled, this happens:

imagem

Notice how in particular the icons are wrong (like a double icon in one of them), and the tabs aren't clear, etc.

imagem

I guess it would require these things:

https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/tree/master/src/stylesheets

To be included in the theme.

Anyway, thanks for this work! It's amazing!

qt.svg can't open some svg files

qt.svg: Cannot open file ':/dark/transparent.svg', because: No such file or directory
qt.svg: Cannot open file ':/dark/transparent.svg', because: No such file or directory
qt.svg: Cannot open file ':/dark/transparent.svg', because: No such file or directory
qt.svg: Cannot open file ':/dark/transparent.svg', because: No such file or directory
qt.svg: Cannot open file ':/dark/down_arrow.svg', because: No such file or directory
qt.svg: Cannot open file ':/dark/down_arrow.svg', because: No such file or directory

Style seems applied sucessfully, but some details lost.

I'm using Qt5.11 with C++ on msvc14.

THX

Is this project abandoned?

While I don't want to tell anybody in an open source project how to spend their time, I've posted an issue (#14) a month ago and received no responses.
I also see that the last merge (#9) is from late 2018 and the last reply from the repo owner is early 2019 (#10) with a fix for an issue from another user that was never merged (#13).

I'm guessing if I don't get a reply that this project is abandoned, I hope this issue will help other (potential new) users understand the status!

Typo issue in breeze_resouces.py

Hello,

First I would like to thank you for your great work!

There is a small typo issue in the filename.
There is a missing r at the end. It should be breeze_resources.py. So the file dark.py and light.py are returning an error.

Thanks.

Ugly Table Sort Arrow

Issue

The table sort arrow currently is placed at the top, with padding, which leads to some unsightly UIs, and isn't great for the default.

TableSortIndicator

How to use this with CMake

Hey! Thanks again for all the support with Qt-ADS!

I wanted to give something back, so here's a text on how to use your amazing work with projects built with CMake. Feel free to include it on your readme if you want:

First, this is what you need on your cmake file:

# This is how I usually setup Qt (makes it work with both Qt5 and Qt6 at the same time
# Setup Qt
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

find_package(
  QT NAMES Qt6 Qt5
  COMPONENTS Core
  REQUIRED)
find_package(
  Qt${QT_VERSION_MAJOR}
  COMPONENTS ${AE_REQUIRED_QT_COMPONENTS}
  REQUIRED)
# -------------------

# For this library:

# Get Python
find_package(Python COMPONENTS Interpreter)

include(FetchContent)

set(FETCHCONTENT_QUIET
    OFF
    CACHE BOOL "Silence fetch content" FORCE)

FetchContent_Declare(
  breeze_stylesheets
  GIT_REPOSITORY https://github.com/Alexhuszagh/BreezeStyleSheets.git
  GIT_TAG origin/master
  GIT_PROGRESS ON
  USES_TERMINAL_DOWNLOAD TRUE)

FetchContent_GetProperties(breeze_stylesheets)
if(NOT breeze_stylesheets_POPULATED)
  FetchContent_Populate(breeze_stylesheets)

  add_library(breeze_themes STATIC "${breeze_stylesheets_SOURCE_DIR}/breeze_themes.qrc")

  add_custom_target(
    run_python_breeze ALL
    COMMAND ${Python_EXECUTABLE} configure.py --extensions=advanced-docking-system
            --styles=dark-green,light-green --resource breeze_themes.qrc
    WORKING_DIRECTORY ${breeze_stylesheets_SOURCE_DIR}
    BYPRODUCTS "${breeze_stylesheets_SOURCE_DIR}/breeze_themes.qrc"
    COMMENT "Generating themes")

  add_dependencies(breeze_themes run_python_breeze)

endif()

And then, add your executable and link with the created library:

add_executable(myapp WIN32 MACOSX_BUNDLE "main.cpp")
target_link_libraries(myapp PRIVATE Qt${QT_VERSION_MAJOR}::Widgets breeze_themes)

On your main.cpp file you need to manually init the resources because they are coming from an external library:

// ...
QApplication qapp(argc, argv);

Q_INIT_RESOURCE(breeze_themes);
QFile file(":/dark-green/stylesheet.qss");
file.open(QFile::ReadOnly | QFile::Text);
QTextStream stream(&file);
qapp.setStyleSheet(stream.readAll());

Borders on windows

Hi, I decided to learn something about PyQt so started developing some simple app. I'm working on Linux, but I would like to run my app on windows also. I really like the dark style whick looks great on Linux.
I noticed that when I run it on Windows 10, borders around almost all widgets are missing. For example that nice blue border around buttons when hovered. Do you know some quick fix for this?

Thank you for your work!

Simplify Tracking/Untracking Build Files

Issue

We want to ensure files in the dist directory are tracked for the default themes, but should be able to untrack/retrack these files when developing custom themes or files with extensions, to avoid updating resource files unnecessarily in Git.

CMake install

The CMake install documentation still lists a file called "breeze_themes.qrc". Looks like this file got renamed to "breeze.qrc".

Question for MIT compliance

Hi, thank you for your project, I added generated theme into my opensource (MIT) project:
https://github.com/mapron/d2modgen
I already added link in "Used thirdparty products" in readme.md. Though not sure if it's enough.
I am not adding your sources to my repo; also, I do not distribute full license with binary package (so in binary release, you can't see thirdarty license).
Is it ok for you? Fair enough?

[BUG] QDial not Styled

Description

The QDial does not have correct styles, leading to too dark notches and too light background styling in the dark theme. The light theme is better, but potentially could be made better.

Screenshot_20220430_083601
Screenshot_20220430_083731

Enable Customizing Colors

A major enhancement has been the use of templates to auto-generate most of the files. This means that customizing your own color palettes should be doable, which might be great, say, for using purple or green for highlights rather than blues for custom themes.

QFileDialog icons are missing

When using PyQT5 and either light or dark theme, the icons in a QFileDialog are not there, and just empty buttons.
light_issue

Without the theme:
system

Called with the code:

        filename = QtWidgets.QFileDialog.getOpenFileName( self, caption="Open Video")

Edit: Super simple program that auto opens the dialog to test with:

import sys

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

import breeze_resources

class Window(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(400, 200)
        QFileDialog.getOpenFileName()
        raise Exception("end app")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    file = QFile(f":/light/stylesheet.qss")
    file.open(QFile.ReadOnly | QFile.Text)
    stream = QTextStream(file)
    app.setStyleSheet(stream.readAll())
    win = Window()
    win.show()
    sys.exit(app.exec_())


Standard Icons are not Overwritten

Issue

Standard icons are only being overwritten in QDialogButtonBox and QMessageBox, leading to ugly icons like the following:
QMenu

This is because the icons are only overwritten here:

QDialogButtonBox
{
    dialogbuttonbox-buttons-have-icons: true;

    dialog-cancel-icon: url(^style^dialog_cancel.svg);
    dialog-close-icon: url(^style^dialog_close.svg);
    dialog-ok-icon: url(^style^dialog_ok.svg);
    dialog-open-icon: url(^style^dialog_open.svg);
    dialog-reset-icon: url(^style^dialog_reset.svg);
    dialog-save-icon: url(^style^dialog_save.svg);
    /**
     *  No support yet for overriding saveall.
     *  dialog-saveall-icon: url(^style^dialog_saveall.svg);
     */
    dialog-yes-icon: url(^style^dialog_ok.svg);
    dialog-help-icon: url(^style^dialog_help.svg);
    dialog-no-icon: url(^style^dialog_no.svg);
    dialog-apply-icon: url(^style^dialog_ok.svg);
    dialog-discard-icon: url(^style^dialog_discard.svg);
}

QMessageBox
{
    messagebox-critical-icon: url(^style^message_critical.svg);
    messagebox-information-icon: url(^style^message_information.svg);
    messagebox-question-icon: url(^style^message_question.svg);
    messagebox-warning-icon: url(^style^message_warning.svg);
}

Solution

This might not be possible with stylesheets (it's unlikely), so I need to clearly document how to do this with actual code.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.