Probleme mit QToolBar

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
midas
User
Beiträge: 7
Registriert: Mittwoch 16. Juli 2014, 06:56

Hallo,

ich beschäftige mich gerade mit der Oberflächenprogrammierung und komme gerade nicht so recht weiter

Ich habe ein Programm das aus zwei Fenstern besteht

Fenster 1 : MainWindow

Code: Alles auswählen

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui = uic.loadUi("ui\ui_MainWindow.ui", self)
        self.ui.nextButton.clicked.connect(self.next)

    @QtCore.pyqtSlot()
    def next(self):

        nextWindow = gen_ui.testwindow.TestWindow()
        nextWindow.show()

....
In diesem Fenster existiert ein Button mit dem ein neues Fenster geöffnet werden soll. In dem neuen Fenster wollte ich eine QToolBar benutzen und musste feststellen das diese nur in einem QMainWindow verfügbar ist.
Ich habe darauf hin ein zweites QMainWindow erstellt. Ich habe gelesen, dass man nur ein Fenster von diesem Typ haben soll. Funktionieren tut es aber bekomme ich nun irgendwelche Probleme?

Code: Alles auswählen

class TestWindow(QtGui.QMainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.ui = uic.loadUi("ui\ui_test.ui", self)
        self.ui.actionSettings.triggered.connect(self.settings)
        self.tabwindow = TabWindow()

    @QtCore.pyqtSlot()
    def settings(self):
        self.ui.verticalLayout.addWidget(self.tabwindow)

In dem zweiten Fenster habe ich nun die ToolBar mit Icons integriert. Wenn auf ein Icon gedrückt wird soll ein neues Fenster in diesem QMainWindow geladen werden. Das funktioniert nun auch aber ich Frage mich ob man das nicht anders lösen sollte.

Hier mal ein Bild von dem zweiten MainWindow mit ToolBar und dem Layout.
Bild


Kann mir jemand Tipps geben?
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

midas hat geschrieben:Ich habe darauf hin ein zweites QMainWindow erstellt. Ich habe gelesen, dass man nur ein Fenster von diesem Typ haben soll. Funktionieren tut es aber bekomme ich nun irgendwelche Probleme?
Wo hast Du das denn gelesen? Meines Wissens nach ist an QMainWindow nichts Magisches - es ist ein vorkonfektioniertes QWigdet mit Menü, Tool- und Statusbalken.
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

QToolBar kann auf jedem Container-Widget platziert werden, das ist nicht an QMainWindow gebunden.
siehe hier: QToolBar
midas
User
Beiträge: 7
Registriert: Mittwoch 16. Juli 2014, 06:56

jerch hat geschrieben:
midas hat geschrieben:Ich habe darauf hin ein zweites QMainWindow erstellt. Ich habe gelesen, dass man nur ein Fenster von diesem Typ haben soll. Funktionieren tut es aber bekomme ich nun irgendwelche Probleme?
Wo hast Du das denn gelesen? Meines Wissens nach ist an QMainWindow nichts Magisches - es ist ein vorkonfektioniertes QWigdet mit Menü, Tool- und Statusbalken.
Das war glaube ich auch in diesem Forum aber finde die Stelle nicht mehr. Aber dann muss ich mir hier keine Gedanken mehr machen.

Kannst du auch was zu dem hinzufügen des Widgets in das Layout was sagen? Macht man das so? Oder gibt es hier einen eleganteren und besseren Weg?

Edit:
Ich arbeite mit dem Qt Designer und dort lässt sich nur einem QMainWindow die QToolBar benutzen. Dann müsste ich die Integration in einem QDialog von Hand erledigen.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@midas:
Die Bindung des Rückgabewertes von `uic.loadUi` an `self.ui` ist unnötig, wenn Du dort `self` übergeben hast, da die Elemente Deines ui-Files direkt über `self.` ohne 'ui.' erreichbar sind.
Die explizite Markierung der Slots mit 'QtCore.pyqtSlot' ist unnötig - bei PyQt sind alle callables slotfähig. Die Markierung brauchst Du nur, falls Du C++ ein spezielle Signatur bekanntmachen musst.
Das mit den Layout funktioniert so. Ob es sich verhält wie es soll, sieht man im Code nicht.
midas
User
Beiträge: 7
Registriert: Mittwoch 16. Juli 2014, 06:56

Okay vielen Dank für die Tipps.

Das mit dem Hinzufügen des Widgets klappt auch aber ich stehe gerade vor dem Problem wie ich dann weitere Widgets hinzufüge.
Jedem Action in meiner ToolBar will ich ein neues Fenster zuweisen das in dem verticalLayout geladen wird.

Code: Alles auswählen

class ConfiguratorWindow(QtGui.QMainWindow):

    def __init__(self, selected_vm):
        QtGui.QMainWindow.__init__(self)
        self.ui = uic.loadUi("ui\ui_ConfiguratorWindow.ui", self)
        self.ui.actionSettings.triggered.connect(self.settings)
        self.ui.actionSoftware.triggered.connect(self.software)
        self.tab_window = TabWindow()
        self.software_window = SoftwareWindow()
        self.selected_vm = selected_vm

    def settings(self):
        self.ui.verticalLayout.addWidget(self.tab_window)

    def software(self):
        self.ui.verticalLayout.addWidget(self.software_window)

Code: Alles auswählen

class TabWindow(QtGui.QTabWidget):

    def __init__(self, parent=None ):
        QtGui.QTabWidget.__init__(self)
        self.ui = uic.loadUi("ui\ui_TabWindow.ui", self)


Code: Alles auswählen

class SoftwareWindow(QtGui.QWidget):

    def __init__(self, parent=None ):
        QtGui.QWidget.__init__(self)
        self.ui = uic.loadUi("ui\ui_TestWindow.ui", self)


Das ich nicht zweimal addWidget machen kann ist mir klar. Habe aber auch schon mit removeWidget probiert, dass erste Widget aus dem Layout zu entfernen aber so funktioniert es irgendwie auch nicht. Das QTabWidget bleibt dauerhaft im Layout
midas
User
Beiträge: 7
Registriert: Mittwoch 16. Juli 2014, 06:56

Ich hab das ganze nun mit einem QTStackWidget hinbekommen ich denke dafür ist die Klasse auch da
Antworten