From 53be089f6ac602f0409112d38502610bcc0f21ab Mon Sep 17 00:00:00 2001 From: Alex Huszagh Date: Sat, 7 May 2022 12:15:49 -0500 Subject: [PATCH] Added workaround for QLCDNumber. Added example workaround for QLCDNumber, along with an explanation of the issues styling the LCD number by default with stylesheets. --- ISSUES.md | 10 ++++ assets/custom_lcd.png | Bin 0 -> 18789 bytes example/lcd.py | 123 ++++++++++++++++++++++++++++++++++++++++++ example/shared.py | 11 ++++ 4 files changed, 144 insertions(+) create mode 100644 assets/custom_lcd.png create mode 100644 example/lcd.py diff --git a/ISSUES.md b/ISSUES.md index 8b05d78..e74ddbd 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -7,6 +7,8 @@ There are limitations to what can be styled with stylesheets, as well as rare bu - [Menu Hover Background Color](#menu-hover-background-color) - [QDial](#qdial) - [Custom Style](#custom-style) +- [QLCDNumber](#qlcdnumber) + - [LCD Color](#lcd-color) - [QMdiSubwindow](#qmdisubwindow) - [Title Bar Icons](#title-bar-icons) - [QSlider](#qslider) @@ -43,6 +45,14 @@ There are limitations to what can be styled with stylesheets, as well as rare bu Custom Dial +# QLCDNumber + +### LCD Color + +The LCD display of a `QLCDNumber` cannot be customized via a stylesheet. An example of how to style a `QLCDNumber` is available in [lcd.py](/example/lcd.py). This works out-of-the-box, and can be a drop-in replacement for `QLCDNumber`. + +Custom Dial + # QMdiSubwindow ### Title Bar Icons diff --git a/assets/custom_lcd.png b/assets/custom_lcd.png new file mode 100644 index 0000000000000000000000000000000000000000..a07fe86bf5431bfa58647246c2004d061da8da48 GIT binary patch literal 18789 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 T#ZTsFs&02~Y1}MQG7I@%*Vg+c literal 0 HcmV?d00001 diff --git a/example/lcd.py b/example/lcd.py new file mode 100644 index 0000000..df69e6d --- /dev/null +++ b/example/lcd.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python +# +# The MIT License (MIT) +# +# Copyright (c) <2022-Present> +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the 'Software'), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +''' + dial + ==== + + Example showing how to override the `paintEvent` and `eventFilter` + for a `QDial`, creating a visually consistent, stylish `QDial` that + supports highlighting the handle on the active or hovered dial. +''' + +import math +import shared +import sys + +parser = shared.create_parser() +parser.add_argument( + '--no-align', + help='''allow larger widgets without forcing alignment.''', + action='store_true' +) +args, unknown = shared.parse_args(parser) +QtCore, QtGui, QtWidgets = shared.import_qt(args) +compat = shared.get_compat_definitions(args) +colors = shared.get_colors(args, compat) + +class LCD(QtWidgets.QLCDNumber): + '''QLCDNumber with a custom palette.''' + + def __init__(self, widget=None): + super().__init__(widget) + self.setContentsMargins(1, 1, 1, 1) + if args.stylesheet == 'native': + return + + # The color of the non-flat LCD numbers is still controlled + # via the `color` stylesheet attribute. + r, g, b, a = colors.HighLightDark.getRgb() + color = (r, g, b, a / 255) + self.setStyleSheet(f'QLCDNumber {{ color: rgba{color}; }}') + + palette = self.palette() + palette.setColor(compat.BackgroundPalette, colors.Background) + palette.setColor(compat.LightPalette, colors.Selected) + palette.setColor(compat.DarkPalette, colors.Notch) + self.setPalette(palette) + +class Ui: + '''Main class for the user interface.''' + + def setup(self, MainWindow): + MainWindow.setObjectName('MainWindow') + MainWindow.resize(1068, 824) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.layout = QtWidgets.QHBoxLayout(self.centralwidget) + self.layout.setSpacing(0) + if not args.no_align: + self.layout.setAlignment(compat.AlignVCenter) + MainWindow.setCentralWidget(self.centralwidget) + + self.lcd1 = LCD(self.centralwidget) + self.lcd1.display(15) + self.lcd1.setDigitCount(2) + self.layout.addWidget(self.lcd1) + + self.lcd2 = LCD(self.centralwidget) + self.lcd2.display(31) + self.lcd2.setHexMode() + self.lcd2.setDigitCount(2) + self.layout.addWidget(self.lcd2) + + self.lcd3 = LCD(self.centralwidget) + self.lcd3.display(15) + self.lcd3.setSegmentStyle(compat.LCDOutline) + self.lcd3.setFrameShape(compat.NoFrame) + self.lcd3.setDigitCount(2) + self.layout.addWidget(self.lcd3) + + self.lcd4 = LCD(self.centralwidget) + self.lcd4.display(15) + self.lcd4.setSegmentStyle(compat.LCDFlat) + self.lcd4.setFrameShape(compat.NoFrame) + self.lcd4.setDigitCount(2) + self.layout.addWidget(self.lcd4) + + +def main(): + 'Application entry point' + + app, window = shared.setup_app(args, unknown, compat) + + # setup ui + ui = Ui() + ui.setup(window) + window.setWindowTitle('QLCDNumber') + + shared.set_stylesheet(args, app, compat) + return shared.exec_app(args, app, window, compat) + +if __name__ == '__main__': + sys.exit(main()) diff --git a/example/shared.py b/example/shared.py index 5a25f93..3b668c2 100644 --- a/example/shared.py +++ b/example/shared.py @@ -245,6 +245,10 @@ def get_compat_definitions(args): ns.MouseButtonRelease = ns.EventType.MouseButtonRelease ns.MouseMove = ns.EventType.MouseMove ns.WindowPalette = ns.ColorRole.Window + ns.WindowTextPalette = ns.ColorRole.WindowText + ns.BackgroundPalette = ns.ColorRole.Background + ns.LightPalette = ns.ColorRole.LightPalette + ns.DarkPalette = ns.ColorRole.DarkPalette ns.PlaceholderText = ns.ColorRole.PlaceholderText ns.ToolTipBase = ns.ColorRole.ToolTipBase ns.ToolTipText = ns.ColorRole.ToolTipText @@ -526,6 +530,10 @@ def get_compat_definitions(args): ns.MouseButtonRelease = QtCore.QEvent.MouseButtonRelease ns.MouseMove = QtCore.QEvent.MouseMove ns.WindowPalette = QtGui.QPalette.Window + ns.WindowTextPalette = QtGui.QPalette.WindowText + ns.BackgroundPalette = QtGui.QPalette.Background + ns.LightPalette = QtGui.QPalette.Light + ns.DarkPalette = QtGui.QPalette.Dark ns.PlaceholderText = QtGui.QPalette.PlaceholderText ns.ToolTipBase = QtGui.QPalette.ToolTipBase ns.ToolTipText = QtGui.QPalette.ToolTipText @@ -739,6 +747,7 @@ def get_colors(args, compat): ns.MidTone = compat.QtGui.QColor(127, 127, 127) ns.ViewBackground = compat.QtGui.QColor(0, 0, 0) ns.TabBackground = compat.QtGui.QColor(0, 0, 0) + ns.HighLightDark = compat.QtGui.QColor(255, 0, 0) if 'dark' in args.stylesheet: ns.Background = compat.QtGui.QColor(49, 54, 59) ns.Foreground = compat.QtGui.QColor(239, 240, 241) @@ -754,6 +763,7 @@ def get_colors(args, compat): ns.MidTone = compat.QtGui.QColor(118, 121, 124) ns.ViewBackground = compat.QtGui.QColor(29, 32, 35) ns.TabBackground = compat.QtGui.QColor(44, 48, 52) + ns.HighLightDark = compat.QtGui.QColor(42, 121, 163) elif 'light' in args.stylesheet: ns.Background = compat.QtGui.QColor(239, 240, 241) ns.Foreground = compat.QtGui.QColor(49, 54, 59) @@ -769,6 +779,7 @@ def get_colors(args, compat): ns.MidTone = compat.QtGui.QColor(186, 185, 184) ns.ViewBackground = compat.QtGui.QColor(239, 240, 241) ns.TabBackground = compat.QtGui.QColor(217, 216, 215) + ns.HighLightDark = compat.QtGui.QColor(45, 147, 200, 127) return ns