【发布时间】:2021-01-08 09:10:38
【问题描述】:
我想要一个按钮。我正在尝试制作一个状态机,所以它将用于 QState 类。
如果鼠标光标悬停,按钮会改变颜色。
如果在按钮上释放鼠标左键,它应该可以工作。
如果在按钮上按下鼠标左键但在按钮外部释放,(按下时将光标拖到外部)按钮不应该工作。 (因此用户可以通过拖出取消他们的未点击。)
这是我的代码,但效果不佳。当我将光标拖到外面并释放鼠标按钮时,按钮就起作用了。
我测试了几件事,现在我明白了一些。
-
按下鼠标按钮时,QPushButton.enterEvent 和 QPushButton.leaveEvent 不起作用。
-
当按下按钮时光标离开 QPushButton 时,似乎 QPushButton.released 发出信号。
如何制作这个按钮?
class MyButton(QtWidgets.QPushButton):
selected = QtCore.pyqtSignal(bool)
def __init__(self, parent=None):
super().__init__(parent)
self.setMouseTracking(True)
self.is_hover = False
def enterEvent(self, event):
self.setStyleSheet\
("color: black; border-style: solid;\
border-width: 2px; border-color: white;\
background-color: rgba(250,0,0,1);")
self.is_hover = True
print('is_hover = True')
def leaveEvent(self, event):
self.setStyleSheet\
("color: white; border-style: solid;\
border-width: 2px; border-color: white;\
background-color: rgba(250,50,150,0.5);")
self.is_hover = False
print('is_hover = False')
def mouseReleaseEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
if self.is_hover:
self.selected.emit(True)
else:
return
else:
return
【问题讨论】:
-
为什么不能使用默认的
clicked()信号并避免整个*事件覆盖?如果要为悬停状态设置样式表,请在按钮的全局 css 中使用:hover选择器。 -
@musicamante 谢谢,clicked() 有效。我对 clicked() 有误解。我认为 clicked() 在单击按钮时会立即发出信号。之前没有学过 PyQt 和 python,所以我搜索了有助于实现目的的函数。
-
@musicamante 感谢 ':hover',我试过了,但没用。我不知道为什么。 'enterEvent' 和 'leaveEvent' 效果很好,所以我会使用它。
标签: python pyqt qpushbutton