From a71eb9fb5e31e79cc85ab0db28a7be27a416b7e3 Mon Sep 17 00:00:00 2001 From: Alex Huszagh Date: Thu, 8 Dec 2022 15:43:31 -0600 Subject: [PATCH] Add example using QPalette for links. --- ISSUES.md | 2 +- example/shared.py | 10 ++++ example/url.py | 125 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 136 insertions(+), 1 deletion(-) create mode 100644 example/url.py diff --git a/ISSUES.md b/ISSUES.md index c4a4add..62e3cab 100644 --- a/ISSUES.md +++ b/ISSUES.md @@ -134,7 +134,7 @@ def main(): ### Links -There is no way to set the default color of a link in a `QLabel`, `QTextEdit`, `QPlainTextEdit`, `QTextBrowser`, `QMessageBox`, etc. There are a few possible workarounds. +There is no way to set the default color of a link in a `QLabel`, `QTextEdit`, `QPlainTextEdit`, `QTextBrowser`, `QMessageBox`, etc. There are a few possible workarounds. A working example using `QPalette` can be found [url.py](/example/url.py). One is to set the link color when setting the label text, here, setting the label text to red. This will override the default color, and you can use a theme-dependent color to ensure the links are rendered properly. diff --git a/example/shared.py b/example/shared.py index 9146587..cd6b0ef 100644 --- a/example/shared.py +++ b/example/shared.py @@ -254,6 +254,8 @@ def get_compat_definitions(args): ns.LightPalette = ns.ColorRole.Light ns.DarkPalette = ns.ColorRole.Dark ns.PlaceholderText = ns.ColorRole.PlaceholderText + ns.Link = ns.ColorRole.Link + ns.LinkVisited = ns.ColorRole.LinkVisited ns.ToolTipBase = ns.ColorRole.ToolTipBase ns.ToolTipText = ns.ColorRole.ToolTipText ns.NoTicks = ns.TickPosition.NoTicks @@ -421,6 +423,7 @@ def get_compat_definitions(args): ns.RubberBandRectangle = ns.RubberBandShape.Rectangle ns.TextSelectableByMouse = ns.TextInteractionFlag.TextSelectableByMouse ns.TextEditorInteraction = ns.TextInteractionFlag.TextEditorInteraction + ns.TextBrowserInteraction = ns.TextInteractionFlag.TextBrowserInteraction ns.Window = ns.WindowType.Window ns.Dialog = ns.WindowType.Dialog ns.SubWindow = ns.WindowType.SubWindow @@ -545,6 +548,8 @@ def get_compat_definitions(args): ns.LightPalette = QtGui.QPalette.Light ns.DarkPalette = QtGui.QPalette.Dark ns.PlaceholderText = QtGui.QPalette.PlaceholderText + ns.Link = QtGui.QPalette.Link + ns.LinkVisited = QtGui.QPalette.LinkVisited ns.ToolTipBase = QtGui.QPalette.ToolTipBase ns.ToolTipText = QtGui.QPalette.ToolTipText ns.NoTicks = QtWidgets.QSlider.NoTicks @@ -706,6 +711,7 @@ def get_compat_definitions(args): ns.RubberBandRectangle = QtWidgets.QRubberBand.Rectangle ns.TextSelectableByMouse = QtCore.Qt.TextSelectableByMouse ns.TextEditorInteraction = QtCore.Qt.TextEditorInteraction + ns.TextBrowserInteraction = QtCore.Qt.TextBrowserInteraction ns.Window = QtCore.Qt.Window ns.Dialog = QtCore.Qt.Dialog ns.SubWindow = QtCore.Qt.SubWindow @@ -778,6 +784,8 @@ def get_colors(args, compat): ns.ViewBackground = compat.QtGui.QColor(29, 32, 35) ns.TabBackground = compat.QtGui.QColor(44, 48, 52) ns.HighLightDark = compat.QtGui.QColor(42, 121, 163) + ns.LinkColor = compat.QtGui.QColor(88, 166, 255) + ns.LinkVisitedColor = compat.QtGui.QColor(255, 88, 250) elif 'light' in args.stylesheet: ns.Background = compat.QtGui.QColor(239, 240, 241) ns.Foreground = compat.QtGui.QColor(49, 54, 59) @@ -794,6 +802,8 @@ def get_colors(args, compat): 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) + ns.LinkColor = compat.QtGui.QColor(70, 132, 204) + ns.LinkVisitedColor = compat.QtGui.QColor(204, 70, 200) return ns diff --git a/example/url.py b/example/url.py new file mode 100644 index 0000000..718a798 --- /dev/null +++ b/example/url.py @@ -0,0 +1,125 @@ +#!/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. + +''' + url + === + + Example showing how to style URLs, since the color of the links + cannot be modified in stylesheets. +''' + +import shared +import sys + +parser = shared.create_parser() +parser.add_argument( + '--set-app-palette', + help='''set the placeholder text palette globally.''', + action='store_true' +) +parser.add_argument( + '--set-widget-palette', + help='''set the placeholder text palette for the affected widgets.''', + 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) + + +def set_palette(widget, role, color): + '''Set the palette for the placeholder text. This only works in Qt5.''' + + palette = widget.palette() + palette.setColor(role, color) + widget.setPalette(palette) + +def set_link_palette(widget): + set_palette(widget, compat.Link, colors.LinkColor) + set_palette(widget, compat.LinkVisited, colors.LinkVisitedColor) + + +class Ui: + '''Main class for the user interface.''' + + def setup(self, MainWindow): + url = 'https://github.com/Alexhuszagh/BreezeStyleSheets' + MainWindow.setObjectName('MainWindow') + MainWindow.resize(400, 200) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName('centralwidget') + self.layout = QtWidgets.QVBoxLayout(self.centralwidget) + self.layout.setObjectName('layout') + self.layout.setAlignment(compat.AlignLeft) + MainWindow.setCentralWidget(self.centralwidget) + + self.repository = QtWidgets.QLabel(self.centralwidget) + self.repository.setObjectName('repository') + self.repository.setText(f'[BreezeStyleSheets]({url})') + self.repository.setTextFormat(compat.MarkdownText) + self.repository.setTextInteractionFlags(compat.TextBrowserInteraction) + self.repository.setOpenExternalLinks(True) + self.layout.addWidget(self.repository) + + self.issues = QtWidgets.QLabel(self.centralwidget) + self.issues.setObjectName('issues') + self.issues.setText(f'[Issues]({url}/issues)') + self.issues.setTextFormat(compat.MarkdownText) + self.issues.setTextInteractionFlags(compat.TextBrowserInteraction) + self.issues.setOpenExternalLinks(True) + self.layout.addWidget(self.issues) + + self.pulls = QtWidgets.QLabel(self.centralwidget) + self.pulls.setObjectName('pulls') + self.pulls.setText(f'[Pull Requests]({url}/pulls)') + self.pulls.setTextFormat(compat.MarkdownText) + self.pulls.setTextInteractionFlags(compat.TextBrowserInteraction) + self.pulls.setOpenExternalLinks(True) + self.layout.addWidget(self.pulls) + + # Set the palettes. + if args.set_widget_palette: + set_link_palette(self.repository) + set_link_palette(self.issues) + set_link_palette(self.pulls) + +def main(): + 'Application entry point' + + app, window = shared.setup_app(args, unknown, compat) + if args.set_app_palette: + set_link_palette(app) + + # setup ui + ui = Ui() + ui.setup(window) + window.setWindowTitle('Stylized URL colors.') + + shared.set_stylesheet(args, app, compat) + return shared.exec_app(args, app, window, compat) + +if __name__ == '__main__': + sys.exit(main())