2016-03-31 9 views
1

Ich habe eine App erstellt, die ein Hauptfenster und die Möglichkeit hat, einen Dialog zu öffnen (Frage, Fehler usw.). Ich verwende nicht QMessageBox.warning() oder QMessageBox.question() und so weiter, weil ich die Dialoge ein wenig anpassen wollte.PySide make QDialog im Hauptfenster erscheinen

Aber jedes Mal, wenn ich einen neuen Dialog öffne, wird in der Windows-Taskleiste (ich arbeite an Windows 10) ein neuer "Tab" geöffnet, was ein wenig nervig ist.

enter image description here

Mein Code (verkürzt):

from PySide import QtCore, QtGui 
import sys 

class MessageBox: 
    def __init__(self, title, message): 
     msg = QtGui.QMessageBox() 
     flags = QtCore.Qt.Dialog 
     flags |= QtCore.Qt.CustomizeWindowHint 
     flags |= QtCore.Qt.WindowTitleHint 
     msg.setWindowFlags(flags) 
     msg.setWindowTitle(title) 
     msg.setText(message) 
     msg.exec_() 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 
     self.show() 

     MessageBox("Title", "My message here") 

if __name__ == "__main__": 
    app = QtGui.QApplication([]) 
    window = MainWindow() 
    sys.exit(app.exec_()) 

Hinweis: Normalerweise wird der Dialog aus einem Menü oder eine Schaltfläche aufgerufen wird.

Frage: Wie kann ich den Dialog im Hauptfenster erscheinen lassen, ohne eine neue 'Taskleiste' zu erstellen?

+0

siehe diese http://stackoverflow.com/a/9043996/4941927, könnte Ihnen helfen – Milor123

+0

@ Milor123 Danke, ich mache es so schon. Der Button wird mit 'self.mybutton.clicked.connect (self.myfunc)' verbunden. In 'myfunc' wird der Dialog mit' MessageBox ("Titel", "Meine Nachricht hier") 'aufgerufen. Irgendwelche Ideen? – linusg

+0

Neben der Tatsache, dass es nicht viel Sinn macht, eine Klasse zu erstellen und nur den ganzen Job im Konstruktor auszuführen (entweder erben Sie, um die Klasse zu erweitern, oder Sie erstellen nur eine Funktion?), Sollten Sie das übergeordnete Element korrekt festlegen der neue Dialog zum Hauptdialog, damit der Fokus und die Fenstergruppierung korrekt funktionieren. –

Antwort

1

Die Lösung war ganz einfach: eine Referenz von QMainWindow an den Konstruktor QDialog Passing wird die Arbeit zu tun, zum Beispiel:

class MessageBox(QtGui.QDialog): 
    def __init__(self, parent, title, message, icon="info"): 
     super(MessageBox, self).__init__(parent) 
     ... 

und dann den Dialog aus einer Klasse aufrufen, die von QMainWindow erbt:

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     super(MainWindow, self).__init__() 

     #connect button with function, e.g.: 
     mybutton.clicked.connect(self.open_dialog) 

    def open_dialog(self): 
     MessageBox(self) 

Vielleicht hilft das jedem!

+0

Warum hast du meine Antwort kopiert? –

+0

@BrendanAbel Oh, tut mir leid, ich habe gedacht, dass 'super (MessageBox, self) .__ init __ (übergeordnete)' und 'QtGui.QMessageBox (übergeordnete)' ist nicht das gleiche. Ich werde meine Antwort ein wenig spezifizieren und deins versuchen, OK? – linusg

+0

Nun, in Anbetracht meiner Antwort empfohlen Unterklassen von QDialog, und das ist, was Sie schließlich getan haben, es scheint, Sie haben bereits meine Lösung versucht. –

0

Wenn Sie das übergeordnete Element von QDialog im Fenster festlegen, wird es nur als ein Element in der Taskleiste angezeigt. Dies ist allgemein das erste Argument für QMessageBox.

class MessageBox: 
    def __init__(self, parent, title, message): 
     msg = QtGui.QMessageBox(parent) 

Auch, wenn Sie wirklich einen benutzerdefinierten Dialog erstellen möchten, können Sie auch nur Unterklasse von QDialog.