In einer grafischen Oberfläche mit PyQt gibt es mehrere `QPushButton`. Bei manchen Buttons, die als Umschalter dienen, soll sichergestellt werden, dass sie nur bei Einfachklicks ein Signal senden und bei Doppelklicks eine Fehlermeldung ausgeben. Andere Buttons hingegen sollen nur auf Doppelklicks ein Signal senden und bei Einfachklicks eine Fehlermeldung ausgeben.
Dazu habe ich mir ein kleines Demonstrationsprogramm auf Basis von etwas Code auf GitHub gebaut.
main.py
Code: Alles auswählen
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtCore import QTimer
from PyQt5.uic import loadUi
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
loadUi("mainwindow.ui", self)
self._single_click_timer = QTimer()
self._single_click_timer.setSingleShot(True)
self._single_click_timer.timeout.connect(self._correct_single_click)
self._double_click_timer = QTimer()
self._double_click_timer.setSingleShot(True)
self._double_click_timer.timeout.connect(self._wrong_single_click)
self.pushButton_single_click.clicked.connect(self.check_single_click)
self.pushButton_double_click.clicked.connect(self.check_double_click)
@staticmethod
def _correct_double_click():
print("Hurra! Doppelklick auf richtigem Button")
@staticmethod
def _wrong_double_click():
print("Fehler! Doppelklick auf falschem Button")
@staticmethod
def _correct_single_click():
print("Hurra! Einfachklick auf richtigem Button")
@staticmethod
def _wrong_single_click():
print("Fehler! Einfachklick auf falschem Button")
def check_single_click(self):
if self._single_click_timer.isActive():
self._wrong_double_click()
self._single_click_timer.stop()
else:
self._single_click_timer.start(250)
def check_double_click(self):
if self._double_click_timer.isActive():
self._correct_double_click()
self._double_click_timer.stop()
else:
self._double_click_timer.start(250)
def main():
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
mainwindow.ui
Code: Alles auswählen
<?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>600</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Einfachklick und Doppelklick</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>120</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>119</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="3">
<widget class="QPushButton" name="pushButton_double_click">
<property name="text">
<string>Doppelklick</string>
</property>
</widget>
</item>
<item row="1" column="4">
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>120</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButton_single_click">
<property name="text">
<string>Einfachklick</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="2">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>24</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
Gruß
Atalanttore