Bei `QPushButton`s zwischen Einfach- und Doppelklicks unterscheiden

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Hallo

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>
Was haltet ihr von der Lösung?

Gruß
Atalanttore
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht viel, weil Doppelklick ein überraschendes und nicht selbsterklärendes Feature ist. Würde ich gerade bei nem Button nicht erwarten. Bestenfalls bei nem Icon. Und WENN man das benutzt, sollte man es nicht selbst machen - denn das OS hat dafür ja Einstellungen die du durch das selbst machen ignorierst.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Meinst du die festgelegte Zeit wie lange ein Doppelklick dauern soll mit den Einstellungen des OS, die durch das selbst machen ignoriert werden?
__deets__
User
Beiträge: 14542
Registriert: Mittwoch 14. Oktober 2015, 14:29

Genau.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Auch ein Button sollte das hier kenne: https://doc.qt.io/qt-5/qwidget.html#mou ... ClickEvent
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

Danke für eure Hinweise.
Antworten