Seite 1 von 1

QMainWindow und QDialog

Verfasst: Sonntag 17. Februar 2019, 14:53
von frcom
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

Re: QMainWindow und QDialog

Verfasst: Sonntag 17. Februar 2019, 15:43
von __blackjack__
@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.

Re: QMainWindow und QDialog

Verfasst: Sonntag 17. Februar 2019, 17:13
von frcom
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

Re: QMainWindow und QDialog

Verfasst: Sonntag 17. Februar 2019, 20:27
von __blackjack__
@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.

Re: QMainWindow und QDialog

Verfasst: Freitag 22. Februar 2019, 11:34
von frcom
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_())