Seite 1 von 1

Problem mit Anzeigen eines Fensters in QDockWidget

Verfasst: Montag 23. November 2015, 20:54
von eggerra
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>

Re: Problem mit Anzeigen eines Fensters in QDockWidget

Verfasst: Dienstag 24. November 2015, 11:27
von jerch
@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()

Re: Problem mit Anzeigen eines Fensters in QDockWidget

Verfasst: Dienstag 24. November 2015, 18:04
von eggerra
Vielen Dank für die Hilfe... funktioniert jetzt