PyQt Цвет фона кнопки не меняется

Для своего текстового редактора я пытаюсь реализовать быстрое создание таблицы размером до 10 столбцов и 8 строк (строк). Он выглядит и работает так же, как в Word или Google Docs:(https://stackru.com/images/19ecbca8b20d13fd48d6475c44fa8c708bf12f86.png)

В моем приложении это выглядит так: (https://stackru.com/images/1399f8ce616fc6f8f037d698696e18161800c43e.png)

У тебяQGridLayoutиз пуговиц 10x8. Если вы наведете курсор на кнопку, цвет ее фона и цвет кнопок всех кнопок с нижним номером столбца и строки изменят цвет фона, чтобы указать размер таблицы.

я используюenterEventчтобы послать сигнал родителю с координатами сетки, и каждая кнопка, имеющая те же или более низкие координаты, что и координаты наведенной кнопки, имеет свойство "hovered" изменено. В соответствующей таблице стилей это свойство должно изменить цвет фона, но этого не происходит.

Я просматривал код несколько раз, но я действительно не вижу проблемы, почему цвет фона кнопок не меняется, поэтому я был бы признателен, если бы у кого-то был ответ.

Вот код этогоQMenu,QWidgetActionс сеткой кнопок и специальнымQPushButton«Кнопка сетки»:

      class TableMenu(QtWidgets.QMenu):
    tableSize = QtCore.pyqtSignal(int, int)

    def __init__(self, parent=None) -> None:
        super().__init__(parent)
        self.setUI()

    def setUI(self) -> None:
        self.AC_TableGrid = TableGrid(self)
        self.AC_TableGrid.tableSize.connect(self.emitTableSize)
        self.addAction(self.AC_TableGrid)

    @QtCore.pyqtSlot(int, int)
    def emitTableSize(self, line: int, column: int) -> None:
        self.tableSize.emit(line, column)

class TableGrid(QtWidgets.QWidgetAction):
    tableSize = QtCore.pyqtSignal(int, int)

    def __init__(self, parent=None) -> None:
        super().__init__(parent)
        self.setUI()

    def setUI(self) -> None:
        self.Grid = QtWidgets.QWidget()
        self.ButtonLayout = QtWidgets.QGridLayout(self.Grid)
        self.ButtonLayout.setHorizontalSpacing(2)
        self.ButtonLayout.setVerticalSpacing(2)

        for iline in range(8):
            for icolumn in range(10):
                button = GridButton()
                button.line = iline+1
                button.column = icolumn+1
                button.entered.connect(self.setMarkedButtons)
                button.sizeSet.connect(self.getTableSize)
                self.ButtonLayout.addWidget(button, iline, icolumn)

        self.Grid.setLayout(self.ButtonLayout)

        self.setDefaultWidget(self.Grid)

    @QtCore.pyqtSlot(int, int)
    def setMarkedButtons(self, line: int, column: int) -> None:
        for i in range(self.ButtonLayout.count()):
            button = self.ButtonLayout.itemAt(i).widget()
            if button.column <= column and button.line <= line:
                print(button, button.line, button.column)
                if button.property("hovered"):
                    button.setProperty("hovered", False)
                else:
                    button.setProperty("hovered", True)

            else:
                button.setProperty("hovered", False)
            button.style().polish(button)            

    @QtCore.pyqtSlot(int, int)
    def getTableSize(self, line: int, column: int) -> None:
        self.tableSize.emit(line, column)

class GridButton(QtWidgets.QPushButton):
    entered = QtCore.pyqtSignal(int, int)
    sizeSet = QtCore.pyqtSignal(int, int)

    def __init__(self, parent=None) -> None:
        super().__init__(parent)
        self.setStyleSheet(fromStyle("GridButton")) # A convenient function to quickly load a stylesheet.
        self.setProperty("hovered", False)
        self.setFixedSize(15, 15)
        self.connectSignals()
        self.line: int
        self.column: int

    def connectSignals(self) -> None:
        self.clicked.connect(self.emitCoordinates)

    def emitCoordinates(self) -> None:
        self.sizeSet.emit(self.line, self.column)
    
    def enterEvent(self, event: QtGui.QEnterEvent) -> None:
        self.entered.emit(self.line, self.column)
        print("Entered!")
        return super().enterEvent(event)

    def leaveEvent(self, a0: QtCore.QEvent) -> None:
        # This is the property to change the background colour
        self.setProperty("hovered", False)
        self.style().polish(self)
        return super().leaveEvent(a0)

Вот таблица стилей "GridButton.qss":

      QPushButton {
    background-color: white;
    border: 1px solid black;
    border-radius: 4px;
}

QPushButton [hovered='true'] {
    background-color: #75b4ec;
}

Я также пробовал аналогичные функции, которые обновляют внешний вид, напримерunpolish()илиupdate()но они тоже не работали.

Удобная функция, которую я создал сам,fromStyle(), тоже отлично работает. Я проверил это. Так что это не должно быть проблемой.

1 ответ

QPushButton изначально имеет состояние для наведения.

      QPushButton:hover{
    background-color: #000000
}
Другие вопросы по тегам