我想使用Python和PyQt5为QPushButton
分配特定的硬件密钥。
以下代码使用事件过滤器为每个QPushButton
过滤鼠标按钮事件。不幸的是,单击动画不是此分配的一部分,只是在每个QPushButton
上单击鼠标左键时出现。
有没有办法实现预期的行为?
main.py
import sys
from PyQt5.QtCore import QEvent, QObject, Qt
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.uic import loadUi
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
loadUi("mainwindow.ui", self)
self.pushButton_left.installEventFilter(self)
self.pushButton_middle.installEventFilter(self)
self.pushButton_right.installEventFilter(self)
def eventFilter(self, obj, event):
if event.type() == QEvent.MouseButtonPress:
if event.button() == Qt.LeftButton and obj.objectName() == "pushButton_left":
print("Left click")
elif event.button() == Qt.MiddleButton and obj.objectName() == "pushButton_middle":
print("Middle click")
elif event.button() == Qt.RightButton and obj.objectName() == "pushButton_right":
print("Right click")
return QObject.event(obj, event)
def main():
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
mainwindow.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1000</width>
<height>200</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<property name="locale">
<locale language="English" country="UnitedKingdom"/>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QPushButton" name="pushButton_left">
<property name="text">
<string>For left mouse button</string>
</property>
</widget>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="2">
<widget class="QPushButton" name="pushButton_middle">
<property name="text">
<string>For middle mouse button</string>
</property>
</widget>
</item>
<item row="0" column="3">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="4">
<widget class="QPushButton" name="pushButton_right">
<property name="text">
<string>For right mouse button</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1000</width>
<height>28</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
答案 0 :(得分:1)
请尝试使用此代码。
说明
默认情况下, QPushButton
由LeftButton
设置动画。
因此,我们需要考虑如何通过MidButton
和RightButton
对其进行动画处理。
动画的真相与setDown(True)
和setDown(False)
的组合相似或相同。因此,当您在{{ 1}}和MidButton
。
但是仍然存在问题。因为RightButton
由mousePressEvent
设置了动画,所以中间按钮和右键仍由mouseReleaseEvent
设置了动画。
您要使名称相互重合。也就是说,LeftButton仅通过leftbutton发出动画。(MidButton仅在midbutton上发出动画,而RightButton仅在rightbutton上发出动画。)
为此,有一种方法可以在QPushButton
中实现return True。
这意味着LeftButton
既服务LeftButton
的事件,又服务小部件本身的事件。
因此,您无需实现按钮的子类并覆盖它。
当您双击按钮时,动画也会发生。因此我对其进行了调节。
eventFilter