QDialog Problem

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
hscherer
User
Beiträge: 16
Registriert: Donnerstag 25. März 2010, 22:07
Wohnort: München

Ich habe ein kleines GUI Programm zum Erstellen einer Fehlermeldung (Ausgabe von mehreren Textzeilen). Dazu benutze ich eine QMessageBox und zwei QTextEdit Elemente.
Wenn ich die GUI starte und das Fenster schließe, verhält sich alles wie erwartet. Benutze ich aber den "Ok" Button von der QMessageBox, verschwindet die QMessageBox mit dem Icon aber die beiden QTexEdit Felder bleiben erhalten.
Ich kann die Zeile mit self.error_msg = QMessageBox() abändern in self.error_msg = QMessageBox(self). Dann erscheint die QMessageBox überhaupt nicht, sonder nur die beiden QTextEdit Felder.

Verwendet wird: Qt Version 6.7.2, PyQt6 Version 6.7.0 mit Python 3.12.5

Was mach ich da falsch? Ich weiß, daß es für die QMessageBox einen "Detailed" Text gibt. Aber ich jetzt schon mehrere Tage gescheitert die QMessageBox in der Größe anzupassen. Daher der Versuch mit "unabhängigen" QTextEdit" Feldern, wobei eines wahrscheinlich reichen würde.

Vermutlich schließt der "ok" Button der "QMessageBox" eben nur diese. Aber wie komme ich an die Information Button "ok" würde gerückt heran? --> dann könnte ich die Textfelder in der Software schließen.
Ich verwende aktuell eine Variante, in der ich noch einen eigenen "pushButton" als zusätzliches Element und die "QMessageBox" ohne Button verwende. Damit habe ich alles in der Hand, aber wieder das Problem mit der sich sehr seltsam verhaltenen Größe der "QMessageBox", die sich
nicht ändert, sondern nur den Abstand von "critical Icon" zum Text anpaßt, aber nicht die angezeigte Textbreite.

Code: Alles auswählen

import sys
from PyQt6.QtWidgets import QApplication, QDialog, QMessageBox, QTextEdit, QVBoxLayout


class __errorWindow(QDialog):
    """Class definition to open Error Window."""

    def __init__(self, parent=None, addOnInfo=False):
        super().__init__(parent)

        self.resize(600, 600)
        # create message box
        self.error_msg = QMessageBox()
        self.error_msg.setIcon(QMessageBox.Icon.Critical)
        self.error_msg.setStandardButtons(QMessageBox.StandardButton.Ok)
        # create a textEdit field
        self.textEdit = QTextEdit()
        self.textEdit.setReadOnly(True)
        # create second textEdit field
        self.addOnInfo = QTextEdit()
        self.addOnInfo.setReadOnly(True)

        # create main layout
        main_layout = QVBoxLayout()
        main_layout.addWidget(self.error_msg)  # add error message box to layout
        main_layout.addWidget(self.textEdit)   # add first textEdit box to layout
        main_layout.addWidget(self.addOnInfo)  # add second textEdit box to layout
        self.setLayout(main_layout)


if not QApplication.instance():
    app = QApplication(sys.argv)
else:
    app = QApplication.instance()

errorWindow = __errorWindow()
print(" ------- ", errorWindow.exec())

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

Vorweg: Klassennamen werden in Python CamelCase geschrieben. Und was sollen die zwei führenden Anführungsstriche, die auch auch noch magisch in Python sind?

Und was ist denn das für ein wildes Konstrukt?
Was passiert da? Geht da der MessageBox auf und _zusätzlich_ ein Dialog?
Mach das nicht, dann hast du das Problem auch nicht. Es klingt so, als würdest du dir einen Dialog mit den entsprechenden Eigenschaften bauen wollen.
hscherer
User
Beiträge: 16
Registriert: Donnerstag 25. März 2010, 22:07
Wohnort: München

Hallo sparrow,

du hast recht. Ich will eigentlichen eine QMessageBox nachbauen, deren Größe ich in der Hand habe. Ziel ist es bei der Fehlerausgabe eine Art Tabelle auszugeben, was mit den entsprechenden html Befehlen einfach machbar ist. Aber die schönste Tabelle nützt nichts, wenn diese durch das Größen Layout der QMessageBox umgebrochen wird (in deren "Detailed" Ansicht).
Ich kann mit dem Style Sheet der QMEssageBox Überschrift, eine Größenänderung erzwingen, die aber dann überraschenderweise auf alle anderen Layouts durchschlägt (QMessageBox.setStyleSheet("QLabel{min-width: %dpx;}" % size) mit "size" als Größe in Pixel).

Alles Gute
Horst
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Man gibt keine festen Werte für die Größe von was auch immer vor. Das überlässt man dem GUI-Toolkit und benutzt Layout-Manager um zu beschreibe, wie die Ausgabe aussehen soll.
Nur weil bei dir 600x600 gut aussieht und alle Elemente hinein passen, muss das auf anderen Systemen nicht so sein.

Zu deinem Problem:
Verwende einfach einen QDialog und setze alle Elemente die du brauchst.
Ich sehe die Notwendigkeit eine QMessageBox gar gar nicht. Schreib doch den Text einfach mit in den QDialog.
Antworten