2016-07-27 34 views
0


Child Dialog nicht erscheint nicht in PyQt5

Hallo, ich versuche, einfache GUI-Anwendung mit PyQt5, Python 3.4 und Windows 7.

Im Folgenden Code funktioniert ordnungsgemäß zu machen.

# coding: utf-8 

import sys 
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog 


class MainWnd(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.popup_dlg = None 
     self.init_ui() 

    def init_ui(self): 
     self.setGeometry(100, 100, 300, 200) 
     self.show() 

     self.popup_dlg = ChildWnd() 


class ChildWnd(QDialog): 
    def __init__(self): 
     super().__init__() 
     self.init_ui() 

    def init_ui(self): 
     self.resize(200, 100) 
     self.show() 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    mw = MainWnd() 
    sys.exit(app.exec_()) 

Zwei Fenster werden erstellt. Eines ist das Hauptfenster und das andere ist das Unterfenster (Popup-Fenster). Aber was ich will ist, dass der Standard-Speicherort des untergeordneten Fensters auf das Hauptfenster zentriert wird.

Also habe ich den Code so geändert.

# coding: utf-8 

import sys 
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog 


class MainWnd(QMainWindow): 
    def __init__(self): 
     super().__init__() 
     self.popup_dlg = None 
     self.init_ui() 

    def init_ui(self): 
     self.setGeometry(100, 100, 300, 200) 
     self.show() 

     self.popup_dlg = ChildWnd(self) # make instance with parent window argument. 


class ChildWnd(QDialog): 

    def __init__(self, parent_wnd): 
     super().__init__() 
     self.setParent(parent_wnd) # set child window's parent 
     self.init_ui() 

    def init_ui(self): 
     self.resize(200, 100) 
     self.show() 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    mw = MainWnd() 
    sys.exit(app.exec_()) 

Aber dieser Code macht ein Problem. Unterfenster wird nicht angezeigt. Nur Hauptfenster (= Elternfenster) zeigt an. In Qt's QDialog's Handbuch habe ich das gefunden.

aber wenn es einen Elternteil hat, ist seine Standardposition oben auf die Top-Level-Widget Eltern zentriert (wenn es nicht auf oberste Ebene ist selbst).

Deshalb habe ich die setParent() hinzugefügt.

Was soll ich tun?

Bitte helfen Sie mir !!

+0

Haben Sie versucht, das Objekt als Parameter an den Super-Konstruktor Mutter vorbei Ihre QDialog? -> super() .__ init __ (parent_wnd) –

+1

@Daniele Pantaleone, ich habe das übergeordnete Objekt in das super-Fenster des untergeordneten Fensters() .__ init __() eingefügt und self.setParent() entfernt. Es klappt! Funktioniert genau was ich will !! Vielen Dank Daniele Pantaleone. Du hast meinen ganzen Tag gerettet XD – passion053

+0

@Daniele Pantaleone, Ach übrigens, ich möchte deine Antwort annehmen. Aber ich kann den Kommentar nicht übernehmen. Kannst du bitte als Antwort umschreiben? – passion053

Antwort

0

Wie in der documentation angegeben Aufruf setParent wird nur die Eigentümerschaft der QDialog Widget ändern. Wenn Sie das QDialog Widget zentriert werden sollen in ihrer Mutter ist, müssen Sie die übergeordnete Widget-Instanz in den Super-Konstruktor Ihrer QDialog weitergeben müssen:

class ChildWnd(QDialog): 

    def __init__(self, parent_wnd): 
     super().__init__(parent_wnd) 
     self.init_ui() 

    def init_ui(self): 
     self.resize(200, 100) 
     self.show() 
+0

Das möchte ich genau! Danke nochmal!! – passion053