Toolbar QDialog vs QMainWindows Modal

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
BarneyG77
User
Beiträge: 9
Registriert: Mittwoch 28. März 2018, 08:55

Hallo zusammen,
ich will mich an der Umsetzung eines C# WinForms Programmes nach PySide versuchen und stolpere dabei ziemlich am Anfang direkt über mein Problem...

Das Hauptfenster habe ich als QMainWindow angelegt. Darüber wird modal eine Parametermaske aufgerufen. Im alten Programm habe ich darin eine Toolbar mit Icons fürs Speichern, Löschen etc..
Soweit ich das sehen recherchieren konnte, gibt es bei QDialog nicht die Möglichkeit eine Toolbar einzublenden, korrekt? Als einzige Alternative wäre eine vhboxlayout möglich welche "normale" Buttons dann behinhaltet... Oder gibt es noch eine andere Möglichkeit?

Wenn ich statt QDialog ein 2tes QMainWindow anlege für die Paramtermaske, kann ich zwar die Toolbar wieder nutzen, aber habe keine Möglichkeit gefunden, das Fenster ebenfalls modal anzuzeigen. Ist das nicht vorgesehen oder habe ich bislang das passende nur nicht gefunden?

Danke im voraus für Eure Antworten und vorab schon mal einen guten Rutsch ;-)
Markus
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also ich finde da zumindest leads, die du ausprobieren könntest. https://stackoverflow.com/questions/213 ... -modal-one
BarneyG77
User
Beiträge: 9
Registriert: Mittwoch 28. März 2018, 08:55

Danke für den Hinweis.. hab gegoogelt, aber trotz setzen des Attributes bleibt das Fenster nicht modal... Hast Du eine Ahnung was ich falsch mache?

Beispiel Window, dass von dem eigentlichen Hauptfenster aufgerufen wird und modal angezeigt werden soll...

Code: Alles auswählen

class TagWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # self.setModal(True)
        self.setFixedSize(500, 600)
        self.setWindowTitle("Tag-Verwaltung")
        self.modal = QDialog(self)
        self.modal.setWindowModality(Qt.WindowModality.WindowModal)
Aufruf aus Hauptfenster

Code: Alles auswählen

def showTags(self):
        """Aufruf der Tag-Verwaltung"""
        self.tag_window = TagWindow()
        self.tag_window.show()
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Also du hast hier ein QMainWindow, das du modal haben willst, aber du setzt das Flag doch auf dem Dialog (der das eh ist). Dann kann TagWindow ja auch nicht modal werden.
BarneyG77
User
Beiträge: 9
Registriert: Mittwoch 28. März 2018, 08:55

Sorry, aber irgendwie kapier ich das gerade nicht.
Kannst Du bitte konkret mal schreiben wo ich was setzen müsste? Passende Beispiele finde ich irgendwie nicht.

Hab jetzt noch folgendes versucht, beides aber auch ohne Erfolg...

Das mit dem Dialog hatte ich nur genommen, weil es in einem Beispiel so war aber auch mit QMainWindow gehts nicht

Code: Alles auswählen

class TagWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # self.setModal(True)
        self.setFixedSize(500, 600)
        self.setWindowTitle("Tag-Verwaltung")
        self.modal = QMainWindow(self)
        self.modal.setWindowModality(Qt.WindowModality.WindowModal)
und dann habe ich noch versucht, es da im Hauptfenster zu ändern wo das "Unterfenster" aufgerufen wird, auch ohne Erfolg...

Code: Alles auswählen

    def showTags(self):
        """Aufruf der Tag-Verwaltung"""
        self.tag_window = TagWindow()
        self.tag_window.setWindowModality(Qt.WindowModality.WindowModal)
        self.tag_window.show()
verglichen mit C# und Java wundert mich doch, dass es hier anscheinend relativ umständlich ist das eine oder andere (Toolbar im "normalen Fenster" oder modales QMainWindow) hinzubekommen... :?
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was soll denn dieses self.modal? Dein TagWindow ist doch ein QMainwindow, und hat die Methode selbst.
BarneyG77
User
Beiträge: 9
Registriert: Mittwoch 28. März 2018, 08:55

self.modal war nur aus einem Beispiel, dass ich gefunden hatte...
Hab das jetzt entfernt, aber auch ohne Erfolg..
"Unterfenster" sieht jetzt nur noch so aus...

Code: Alles auswählen

class TagWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # self.setModal(True)
        self.setFixedSize(500, 600)
        self.setWindowTitle("Tag-Verwaltung")
        self.setWindowModality(Qt.WindowModality.WindowModal)
Hier habe ich mit und ohne setWindowModality das Ganze versucht

Hauptfenster sieht jetzt so aus aber auch ohne Erfolg

Code: Alles auswählen

    def showTags(self):
        """Aufruf der Tag-Verwaltung"""
        self.tag_window = TagWindow()
        self.tag_window.setWindowModality(Qt.WindowModality.WindowModal)
        self.tag_window.show()
Die meisten Beispiele die ich finde, beziehen sich auf QMainWindow und QDialog, was mir leider wegen der fehlenden Toolbar nicht wirklich hilft...
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn’s nicht geht, dann “will” qt das vielleicht einfach nicht. Das Framework macht halt viele Annahmen, wie Anwendungen sein sollten. Gerade mit QMainWindow.

Laut https://doc.qt.io/qt-6/qtoolbar.html kannst du deine Toolbar aber auch im QDialog haben.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also bei mir funktioniert das problemlos und auch einfach ein `QMainWindow` modal zu machen. Nicht so viel Beispiele im Netz suchen sondern mal nachlesen was das bedeutet was man da macht. In diesem Beispiel was Qt.WindowModality.WindowModal für einen Effekt hat: Das blockiert Eingaben beim Elternwidget, dessen Grosseltern und so weiter, und bei den ganzen Geschwistern. Da zumindest im gezeigten Code kein Elternwidget gesetzt wird, blockiert das folgerichtig gar nichts. Sobald man das aber tut, funktioniert es auch.

Code: Alles auswählen

#!/usr/bin/env python3
import sys

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton


def main():
    app = QApplication(sys.argv)

    window = QMainWindow()
    window.setCentralWidget(
        QPushButton(
            "Push me!",
            clicked=lambda: QMainWindow(
                window, windowModality=Qt.WindowModality.WindowModal
            ).show(),
        )
    )
    window.show()

    sys.exit(app.exec())


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten