Seite 1 von 1

Bei `QPushButton`s zwischen Einfach- und Doppelklicks unterscheiden

Verfasst: Donnerstag 24. Oktober 2019, 20:31
von Atalanttore
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

Re: Bei `QPushButton`s zwischen Einfach- und Doppelklicks unterscheiden

Verfasst: Donnerstag 24. Oktober 2019, 20:38
von __deets__
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.

Re: Bei `QPushButton`s zwischen Einfach- und Doppelklicks unterscheiden

Verfasst: Donnerstag 24. Oktober 2019, 20:42
von Atalanttore
@__deets__: Meinst du die festgelegte Zeit wie lange ein Doppelklick dauern soll mit den Einstellungen des OS, die durch das selbst machen ignoriert werden?

Re: Bei `QPushButton`s zwischen Einfach- und Doppelklicks unterscheiden

Verfasst: Donnerstag 24. Oktober 2019, 21:20
von __deets__
Genau.

Re: Bei `QPushButton`s zwischen Einfach- und Doppelklicks unterscheiden

Verfasst: Donnerstag 24. Oktober 2019, 22:44
von sparrow
Auch ein Button sollte das hier kenne: https://doc.qt.io/qt-5/qwidget.html#mou ... ClickEvent

Re: Bei `QPushButton`s zwischen Einfach- und Doppelklicks unterscheiden

Verfasst: Samstag 26. Oktober 2019, 12:19
von Atalanttore
Danke für eure Hinweise.