Изменить цвет строки заголовка QDocketWidget с помощью CSS - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть графический интерфейс с QDockwidget, и я хотел бы, чтобы цвет строки заголовка виджетов док-станции менял цвет, если пользователь наводит курсор над ним с помощью курсора мыши.У меня есть небольшая тестовая программа ниже, где строка заголовка меняет цвет, когда курсор находится над ней.Тем не менее, он также меняет цвет, если курсор находится над остальной частью виджета закрепления.Есть ли способ исправить это?

CSS = """

    QDockWidget::title {
        background-color: lightblue; 
        border: 1px solid black;
    }

    QDockWidget::title:hover {
        background: yellow;
    }

    QMainWindow::separator {
        background: palette(Midlight);
    }

    QMainWindow::separator:hover {
        background: palette(Mid);
    }
"""

from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QSize

class CenteredLabel(QtWidgets.QWidget):

    def __init__(self, text, parent=None):
        super().__init__(parent=parent)
        self.verLayout = QtWidgets.QVBoxLayout()
        self.setLayout(self.verLayout)
        self.horLayout = QtWidgets.QHBoxLayout()
        self.verLayout.addLayout(self.horLayout)
        self.label = QtWidgets.QLabel(text)
        self.horLayout.addWidget(self.label)

    def sizeHint(self):
        return QSize(300, 400)


class MyWindow(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setCentralWidget(CenteredLabel("Central Widget"))
        self.dockWidget = QtWidgets.QDockWidget("Dock Title", parent=self)
        self.dockWidget.setWidget(CenteredLabel("Dock Widget"))
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget)


def main():
    app = QtWidgets.QApplication([])

    # Fusion style is the default style on Linux
    app.setStyle(QtWidgets.QStyleFactory.create("fusion"))
    app.setStyleSheet(CSS)

    win = MyWindow()
    win.show()
    win.raise_()
    app.exec_()

if __name__ == "__main__":
    main()

PS Я установил стиль приложения Qt на fusion, который полностью настраивается с помощью палитр (в отличие, например, от стиля macintosh).Я предпочитаю решение, которое работает со всеми стилями Qt, но если это невозможно, я могу рассмотреть возможность установки стиля моего приложения на fusion на всех платформах.

1 Ответ

0 голосов
/ 12 января 2019

Я попробовал ваш код и смог воспроизвести ту же проблему, мне это кажется ошибкой.

Вот возможный обходной путь с использованием пользовательского виджета в качестве заголовка:

from PyQt5.QtWidgets import QLabel

CSS = """
    #CustomTitle {
        background-color: lightblue; 
        border: 1px solid black;
    }

    #CustomTitle:hover {
        background: red;
    }

    QMainWindow::separator {
        background: palette(Midlight);
    }

    QMainWindow::separator:hover {
        background: palette(Mid);
    }
"""

from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QSize

class CenteredLabel(QtWidgets.QWidget):

    def __init__(self, text, parent=None):
        super().__init__(parent=parent)
        self.verLayout = QtWidgets.QVBoxLayout()
        self.setLayout(self.verLayout)
        self.horLayout = QtWidgets.QHBoxLayout()
        self.verLayout.addLayout(self.horLayout)
        self.label = QtWidgets.QLabel(text)
        self.horLayout.addWidget(self.label)

    def sizeHint(self):
        return QSize(300, 400)


class MyWindow(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setCentralWidget(CenteredLabel("Central Widget"))
        self.dockWidget = QtWidgets.QDockWidget(parent=self)
        self.dockWidget.setWidget(CenteredLabel("Dock Widget"))
        self.customTitle = QLabel("Dock Title", parent=self.dockWidget)
        self.customTitle.setObjectName("CustomTitle")
        self.dockWidget.setTitleBarWidget(self.customTitle)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.dockWidget)


def main():
    app = QtWidgets.QApplication([])

    # Fusion style is the default style on Linux
    app.setStyle(QtWidgets.QStyleFactory.create("fusion"))
    app.setStyleSheet(CSS)

    win = MyWindow()
    win.show()
    win.raise_()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...