Nichtlineare-Fensterabfolge mit Wiederholung

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
jnkws
User
Beiträge: 8
Registriert: Dienstag 15. Dezember 2020, 11:47

Hallo,

ich bin erst kürzlich in die Welt von Qt eingetaucht. Ich habe ein Maschine gebaut, die aus Sägespänen Pellets macht. Diese Maschine soll mit einem Raspberry Pi gesteuert werden. Aktuell bin ich dabei das HMI mit PyQt zu entwerfen.
Die Maschine hat unterschiedliche Modis. Am Anfang kann man auswählen zwischen "Automatisch" und "Manuell". Danach soll je nach Auswahl das nächste Fenster kommen und so weiter, bis man irgenwann alles ausgewählt hat und auf Start drücken kann.
Nach dem die Maschine den gewünschten Prozess ausgeführt hat, soll man wieder auf dem ersten Fenster landen, sodass man alles von neuem auswählen kann.

Ich hab schon viel im Internet gesucht, aber noch nicht so viel gefunden. Meine Idee ist das ganze als QWizard aufzubauen, mit QWizardPages. Kann man das machen, dass man von der letzten immer wieder zur ersten Seite springt? Oder gibt es noch eine bessere Möglichkeit?

Ich freue mich auf eure Hilfe. Danke :)

Gruß
Jan
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Kann man machen und klingt vernünftig. Daran erkenne ich jedoch nichts Nichtlineares. Alternative wären Tabs, falls es gewünscht ist bspw. von der 5. Eingabemaske zur 2. springen zu können.
jnkws
User
Beiträge: 8
Registriert: Dienstag 15. Dezember 2020, 11:47

Danke für die schnelle Antwort.

Im Endeffekt sollen unten am Rand nur noch der Back-Button sein. Auf die nächste Seite soll man gelangen, indem man eine der vorgeschlagenen Optionen auswählt. Das Ganze soll auch benutzerfreundlich aussehen und nicht wie ein typisches Installationsfenster.

Habe auch schon was von QStackedWidgets gelesen. Wäre das hier vielleicht besser geeignet? Oder sieht man dann am Rand immer diese Tableiste?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`QStackedWidget` hat keine Tabs, das wäre `QTabWidget`.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
jnkws
User
Beiträge: 8
Registriert: Dienstag 15. Dezember 2020, 11:47

Habe bereits schon viel gegoogelt und im Forum gesucht, bin aber leider nicht auf eine Antwort gekommen.

Ich habe gerade in PyQt einen Wizard erstellt. Nun möchte ich durch klicken eines Buttons auf die nächste Seite weitergeleitet werden. Habe gelesen das man dafür QCommandLinkButton benötigt. Ich schaffe es aber nicht das Signal von von dem Button mit dem Slot der next() Funktion zu verbinden.

Zweite Frage: Könnte ich das auch mit einem normalen PushButton machen?

Dritte Frage: Habe in meiner Klasse ClassWizard (erbt von QWizard) die Id der Seiten festgelegt. Wie kann man auf die Id zugreifen ohne die Klasse zu importieren, wie unten im Beispiel.

Danke für eure Hilfe.

Code: Alles auswählen

from PyQt5.QtWidgets import (QApplication, QCheckBox, QGridLayout, QGroupBox,
        QLabel, QLineEdit, QMessageBox, QRadioButton, QVBoxLayout, QWizard,
        QWizardPage, QPushButton, QCommandLinkButton)
from PyQt5.QtCore import pyqtSlot

from ClassWizard import *

class Hauptseite(QWizardPage):
    def __init__(self, parent=None):
        super(Hauptseite, self).__init__(parent)

        self.setTitle("Hauptseite")


        self.pybutton2 = QPushButton('Transport', self)
        self.pybutton2.resize(100,32)
        self.pybutton2.move(240, 20)        
        #self.pybutton2.clicked.connect(self.next)
       #self.pybutton2.clicked.connect(ClassWizard.next())

        self.cl_button = QCommandLinkButton("Next", self)
        self.cl_button.clicked.connect(QWizard.next)
         
    
    
    def nextId(self):
            return ClassWizard.Saegen

        
 
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@jnkws: `Class` hat nichts in Klassennamen zu suchen. Dass das eine Klasse ist, erkennt man schon an der Schreibweise. Und bitte auch nicht eine Datei pro Klasse. Python ist nicht Java.

Durch was die `next()`-Methode eines `QWizard` aufgerufen wird ist der `next()`-Methode ziemlich egal. Warum das ein `QCommandLinkButton` sein müssen sollte ist mir schleierhaft.

Was man benutzen will muss definiert werden. Wenn es in einem anderen Modul definiert ist, dann muss man es importieren.

Beim Importieren dann aber ohne *. Damit importiert man nicht nur was in dem Modul direkt definiert wurde, sondern auch alles was das Modul seinerseits irgend wo anders her importiert hat. Da könnte man sich das aufteilen in Module auch ganz sparen. Zudem sieht man dann nicht mehr was eigentlich woher kommt.

Du solltest an den Namen arbeiten. Keine kryptischen Abkürzungen und keine nummerierten Namen. Was soll denn in `pybutton2` das `py` überhaupt bedeuten? In den Namen muss man auch nicht den Typ genau kodieren. Was interessiert denn den Leser ob man einen `QPushbutton` oder einen `QCommandLinkButton` hat? Die für den leser interessanten Bedeutungen diesem Wert sind das es ein Button ist und für was der steht, also beispielsweise `next_button`. Und der andere `transport_button` statt `pybutton2`.

Ein Signal mit `QWizard.next` zu verbinden macht keinen Sinn. Das ist die ungebundende `next()`-Funktion auf dem Typ `QWizard`, Du brauchst da aber die gebundene Methode auf einem konkreten `QWizard`-Objekt.

Letztlich arbeitest Du aber auch gegen das Rahmenwerk wenn Du auf Deinen Wizard-Seiten Buttons anbietest die aktiv die nächste Seite aufrufen. Dafür ist der entsprechende Button auf dem Wizard da. Vorgesehen ist bei nicht-linearen Wizards, dass die Wizardseite die `nextId()`-Methode überschreibt. Das heisst Du kannst auf der Wizardseite den Benutzer Eingaben machen lassen, welche den bei Aufruf der `nextId()` als Entscheidungsgrundlage dienen welche Folgeseite kommt.

Wenn Du die vorgesehene Infrastruktur nicht nutzt bzw. sogar gegen sie programmierst, dann wäre es besser `QWizard` gar nicht zu verwenden, statt das ”gewaltsam” so zu verbiegen wie Du das gerne hättest.

Du rufst auf dem einen Button-Objekt `move()` und `resize()` auf → Grösse und Position bestimmt man über Layouts, nicht über absolute Pixelangaben.

`super()` braucht keine Argumente. Hör auf Python 2 Code in Python 3 zu schreiben.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten