QMainWindow und QDialog

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
frcom
User
Beiträge: 44
Registriert: Sonntag 24. September 2017, 19:35

Sonntag 17. Februar 2019, 14:53

Hallo,
Ich möchte gerne grundsätzlich das QBoxLayout verwenden, wofür ich ja den QDialog in die Class, in der ich das Fenster erstelle vererben muss. Nun möchte ich aber zusätzlich auch noch eine MenuBar in das Fenster bringen, wofür ich aber ja QMainWindow vererben muss. Beides einzeln bekomme ich prima hin, aber beides Zusammen, weiß ich nicht, wie ich das mache...
Hoffe mir kann jmd eine schöne Antwort liefern.
Vielen Dank und schönen Sonntag,
Leon
Benutzeravatar
__blackjack__
User
Beiträge: 4499
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sonntag 17. Februar 2019, 15:43

@frcom: Die Fragestellung ist irgendwie schräg. Layouts kann man in jedem Widget verwenden, also nicht nur in QDialog. Und wenn Du eine Menüleiste haben möchtest, dann willst Du keinen Dialog haben, denn Dialoge haben keine Menüleisten. Also nimm ein QMainWindow und verwende dort im zentralen Widget welches Layout auch immer Du verwenden möchtest.
“Give a man a fire and he's warm for a day, but set fire to him and he's warm for the rest of his life.”
— Terry Pratchett, Jingo
frcom
User
Beiträge: 44
Registriert: Sonntag 24. September 2017, 19:35

Sonntag 17. Februar 2019, 17:13

Mh Aber wie binde ich das denn dann ein? Hier mal ein minimalbeispiel zur Veranschaulichung:

Code: Alles auswählen

from PyQt5.QtWidgets import (QApplication, QDialog, QHBoxLayout, QMainWindow, QGridLayout)

class window(QDialog): #QDialog, um QBoxLayout zu verwenden
	def __init__(self, parent=None):
        	super(window, self).__init__(parent)
        	
		self.createTopLeftGroupBox()
		#MenuBar
		
		topLayout = QGridLayout()
		
        	mainLayout = QGridLayout()
	        mainLayout.addLayout(topLayout, 0, 0, 1, 2)
        	mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
        	
if __name__ == '__main__':
	app = QApplication(sys.argv)
	gallery = window()
	gallery.show()
	sys.exit(app.exec_())
Wenn ich jetzt an die Stelle, an der ich den Kommentar MenuBar reingeschieben habe folgendes einbaue, bekomme ich aber eine Fehlermeldung...

Code: Alles auswählen

mainMenu = self.menuBar()
fileMenu = mainMenu.addMenu('File')
editMenu = mainMenu.addMenu('Edit')
viewMenu = mainMenu.addMenu('View')
searchMenu = mainMenu.addMenu('Search')
toolsMenu = mainMenu.addMenu('Tools')
helpMenu = mainMenu.addMenu('Help')
Die Fehlermeldung:

Code: Alles auswählen

AttributeError: 'window' object has no attribute 'menuBar'
Wenn ich in der class window 'window(QMainWindow): ' vererbe, bekomme ich die Menubar, aber den Fehler, dass QBoxLayout kein attribute von window sei...
Hoffe ich habe meine Frage jeztz besser aufgezeigt,
Liebe Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 4499
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sonntag 17. Februar 2019, 20:27

@frcom: Ähm, ich habe doch geschrieben das Dialoge keine Menüleiste haben und das Du ein Hauptfenster willst. Und nun zeigst Du einen Dialog und wunderst Dich das der keine Menüleiste hat…

Kein Fenster/Widget hat ein QBoxLayout-Attribut. Keine Ahnung was Du da aus welcher Ausnahme herausgelesen hast. Und noch mal `QBoxLayout` kann man in jedem `QWidget` verwenden. Schau Dir einfach mal in der Dokumentation an wie man bei Hauptfenstern ein/das zentrale Widget setzt.
“Give a man a fire and he's warm for a day, but set fire to him and he's warm for the rest of his life.”
— Terry Pratchett, Jingo
frcom
User
Beiträge: 44
Registriert: Sonntag 24. September 2017, 19:35

Freitag 22. Februar 2019, 11:34

Hallo __blackjack__ ich habe mich der Suche endlich mal angenommen und bin auch direkt fündig geworden. Ich stand einfach völlig auf dem Schlauch und kam nicht auf die Idee eine zweite Class für das zentrale Widget zu bauen... Vielen Dank für deine Tips und Hilfe! Für alle, die auch auf dem Schlauch stehen, habe ich hier noch meine minimallösung... Falls jemand etwas auszusetzen hat, nur her damit!

Code: Alles auswählen

class window(QMainWidget):
	def __init__(self, parent=None):
        	super(window, self).__init__(parent)
        	
        	mainMenu = self.menuBar()
        	fileMenu = mainMenu.addMenu('File')
        	editMenu = mainMenu.addMenu('Edit')
        	viewMenu = mainMenu.addMenu('View')
        	searchMenu = mainMenu.addMenu('Search')
        	toolsMenu = mainMenu.addMenu('Tools')
        	helpMenu = mainMenu.addMenu('Help')
        
        	self.form_widget = main_widget(self) 
        	self.setCentralWidget(self.form_widget)
        	
class main_widget(QDialog):
	def __init__(self, parent=None):
        	super(main_widget, self).__init__(parent)
        	
        	self.createTopLeftGroupBox()
        	#...
        	
		topLayout = QGridLayout()
		
        	mainLayout = QGridLayout()
	        mainLayout.addLayout(topLayout, 0, 0, 1, 2)
        	mainLayout.addWidget(self.topLeftGroupBox, 1, 0)
        	
if __name__ == '__main__':
	app = QApplication(sys.argv)
	gallery = window()
	gallery.show()
	sys.exit(app.exec_())

Antworten