#python #pyqt #pyqt5
#python #pyqt #pyqt5
Вопрос:
Я хотел бы назначить определенный аппаратный ключ для QPushButton
использования Python и PyQt5.
Следующий код использует фильтры событий для фильтрации событий кнопок мыши для каждого 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>
Комментарии:
1. Я вас не понимаю, не могли бы вы объяснить мне лучше
2. Желаемое поведение заключается в том, что
QPushButton
при нажатии кнопки не должно отображаться анимация щелчка.3. @user9402680 Анимация щелчка для щелчков левой кнопкой мыши по-прежнему является частью каждого
QPushButton
.4. @Atalanttore То, что вы указываете, может сбивать с толку, вы не хотите, чтобы вид нажатой кнопки отображался, или вы не хотите показывать переход от не нажатой кнопки к нажатой кнопке
5. @user9402680 Отлично, ваш код реализует желаемое поведение.
Ответ №1:
Пожалуйста, попробуйте этот код.
Объяснение
QPushButton
анимируется LeftButton
настройкой по умолчанию. Поэтому нам нужно подумать, как анимировать ее с помощью MidButton
и RightButton
.
Истинность анимации аналогична или совпадает с комбинацией setDown(True)
и setDown(False)
.Поэтому я реализую их, когда вы щелкаете по MidButton
и RightButton
между mousePressEvent
и mouseReleaseEvent
.
Но проблема остается. Потому QPushButton
что анимируется LeftButton
, поэтому средняя кнопка и правая кнопка по-прежнему анимируются LeftButton
.
Вы хотите, чтобы имена совпадали друг с другом.То есть, leftButton генерирует анимацию только с помощью leftbutton.( MidButton запускает анимацию только для средней кнопки, а RightButton запускает анимацию только для правой кнопки.)
Для этого есть способ реализовать return True в eventFilter
. Это означает eventFilter
, что обслуживает как событие eventFilter
, так и событие самого виджета.
Итак, вам не нужно реализовывать подкласс для кнопки и переопределять его.
Когда вы нажимаете на кнопку dblclick, анимация также происходит.Итак, я это отрегулировал.
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.MouseButtonDblClick:
if event.button() == Qt.LeftButton and obj.objectName() == "pushButton_middle":
return True
elif event.button() == Qt.LeftButton and obj.objectName() == "pushButton_right":
return True
if event.type() == QEvent.MouseButtonPress:
if event.button() == Qt.LeftButton and obj.objectName() == "pushButton_left":
print("Left click")
elif event.button() == Qt.LeftButton and obj.objectName() == "pushButton_middle":
obj.setDown(False)
return True
elif event.button() == Qt.MiddleButton and obj.objectName() == "pushButton_middle":
obj.setDown(True)
print("Middle click")
elif event.button() == Qt.LeftButton and obj.objectName() == "pushButton_right":
obj.setDown(False)
return True
elif event.button() == Qt.RightButton and obj.objectName() == "pushButton_right":
obj.setDown(True)
print("Right click")
elif event.type() == QEvent.MouseButtonRelease:
if event.button() == Qt.LeftButton and obj.objectName() == "pushButton_left":
print("Left click")
elif event.button() == Qt.LeftButton and obj.objectName() == "pushButton_middle":
return True
elif event.button() == Qt.MiddleButton and obj.objectName() == "pushButton_middle":
obj.setDown(False)
print("Middle click")
elif event.button() == Qt.LeftButton and obj.objectName() == "pushButton_right":
return True
elif event.button() == Qt.RightButton and obj.objectName() == "pushButton_right":
obj.setDown(False)
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()
Комментарии:
1. Это хорошее начало, но все равно все
QPushButton
показывают анимацию при нажатии левой кнопкой мыши.2. @Atalanttore Я вижу, я скучаю по этому.Хорошо.