将特定的“ QPushButton”分配给特定的硬件按钮

时间:2019-04-21 14:11:32

标签: python pyqt pyqt5

我想使用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>

1 个答案:

答案 0 :(得分:1)

请尝试使用此代码。

说明

默认情况下,

QPushButtonLeftButton设置动画。 因此,我们需要考虑如何通过MidButtonRightButton对其进行动画处理。

动画的真相与setDown(True)setDown(False)的组合相似或相同。因此,当您在{{ 1}}和MidButton

但是仍然存在问题。因为RightButtonmousePressEvent设置了动画,所以中间按钮和右键仍由mouseReleaseEvent设置了动画。

您要使名称相互重合。也就是说,LeftButton仅通过leftbutton发出动画。(MidButton仅在midbutton上发出动画,而RightButton仅在rightbutton上发出动画。)

为此,有一种方法可以在QPushButton中实现return True。 这意味着LeftButton既服务LeftButton的事件,又服务小部件本身的事件。

因此,您无需实现按钮的子类并覆盖它。

当您双击按钮时,动画也会发生。因此我对其进行了调节。

eventFilter