Problem mit Anzeigen eines Fensters in QDockWidget

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
eggerra
User
Beiträge: 2
Registriert: Montag 23. November 2015, 20:42

Hallo,

Ich versuche gerade mittels eines QDockWidget( PySide; Gui-Design in Qt-Designer) ein (externes) Programm in mein GUI einzubinden.

Bei on_btnCone_clicked: wird das Programm in das MainWindow(central Widget) ohne Probleme geladen.

Jedoch bei on_btnBox_clicked: funktioniert das leider nicht.

Anbei der code:

Ich bin noch recht neu in Python/PySide/Designer, darum hoffe ich dass mir jemand bei meinem Problem weiterhelfen kann.
VIelen Dank schon mal im Voraus!

Code: Alles auswählen

class MainWindow(QtGui.QMainWindow):

    def __init__(self,parent=None):
        QMainWindow.__init__(self)
        loader = QUiLoader()
        self.ui = loader.load('simpleGui_FreeCAD.ui',self)
        QMetaObject.connectSlotsByName(self)

        # docwid = QDockWidget()
        # FreeCADGui.showMainWindow()
        # get = FreeCADGui.getMainWindow()
        # docwid.setWidget(get)



    @Slot()
    def on_btnCone_clicked(self):
        #FreeCADGui.addWorkbench(BlankWorkbench)
        #FreeCADGui.activateWorkbench("BlankWorkbench")
        #QtGui.QDockWidget.setWidget(FreeCADGui.showMainWindow())
        #FreeCADGui.showMainWindow()
        #FreeCADGui.showMainWindow()
        FreeCADGui.showMainWindow()
        get = FreeCADGui.getMainWindow()
        self.ui.setCentralWidget(get)
        print 'test'

    @Slot()
    def on_btnBox_clicked(self):
        QMessageBox.information(self,"Hello", "Test")
        docwid = QDockWidget()
        FreeCADGui.showMainWindow()
        get = FreeCADGui.getMainWindow()
        docwid.setWidget(get)
Und die Ui-File:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QWidget" name="freecad_widget" native="true">
    <property name="geometry">
     <rect>
      <x>350</x>
      <y>110</y>
      <width>301</width>
      <height>251</height>
     </rect>
    </property>
   </widget>
   <widget class="QWidget" name="">
    <property name="geometry">
     <rect>
      <x>90</x>
      <y>110</y>
      <width>77</width>
      <height>83</height>
     </rect>
    </property>
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
      <widget class="QPushButton" name="btnBox">
       <property name="text">
        <string>Click for Box</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="btnCone">
       <property name="text">
        <string>Click for Cone</string>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QPushButton" name="btnExit">
       <property name="text">
        <string>Exit</string>
       </property>
      </widget>
     </item>
    </layout>
   </widget>
   <zorder>freecad_widget</zorder>
   <zorder>btnBox</zorder>
   <zorder>btnCone</zorder>
   <zorder>btnExit</zorder>
   <zorder>btnExit</zorder>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>800</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@eggerra:
Deinem `docwid` fehlt das Parent, in welchem Qt das Widget darstellen soll (Dein Hauptfenster). Zusätzlich ist docwid eine lokale Variable und wird von Python nach Verlassen der Methode aufgeräumt, weshalb kurz ein Fenster mit dem Widget aufflackern könnte, aber sofort wieder verschwindet.

Abhilfe1 - Einbetten in anderes Widget:

Code: Alles auswählen

def mySuperMethod(self):
    ...
    # self ist hier parent, die "Referenz" `widget` ist optional,
    # da Qt über die Parentbeziehung die Referenz auf das Objekt hält
    widget = MySuperQtWidget(self)
Abhilfe2 - eigenständiges Fenster:

Code: Alles auswählen

def mySuperMethod(self):
    ...
    # "Referenz" `self.wotever` ist wichtig, damit es nicht gelöscht wird
    # da kein Parent gesetzt wird ist das Widget ein eigenständiges Fenster
    self.wotever = MySuperQtWidget()
eggerra
User
Beiträge: 2
Registriert: Montag 23. November 2015, 20:42

Vielen Dank für die Hilfe... funktioniert jetzt
Antworten