Назначить конкретную `QPushButton` конкретной аппаратной кнопке

#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 Я вижу, я скучаю по этому.Хорошо.