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
}