Hubschr
Hubschr

Reputation: 1335

How do I add a menubar to a QWidget?

I have a Qwidget thats usually is displayed in a Qmainwindow. Sometimes its unnecessary to use the whole mainwindow, because you only want to use functions from a certain Qwidget. If that's the case, I want a menubar in my widget.

I tried:

if parent  == "self":
    self.layout().addMenubar(self)

But using the code above the its just stops compiling without raising any error. What Im doing wrong? Thanks!

Upvotes: 4

Views: 18439

Answers (4)

rainer
rainer

Reputation: 3411

There is also a pretty clean way to combine QMainWindow with QWidget, using two classes:

import sys
from PyQt4 import QtCore, QtGui

class MainWindow(QtGui.QMainWindow): 

def __init__(self, parent=None): 

    super(MainWindow, self).__init__(parent)

    self.win_widget = WinWidget(self)
    widget = QtGui.QWidget()
    layout = QtGui.QVBoxLayout(widget)
    layout.addWidget(self.win_widget)

    self.setCentralWidget(widget)
    self.statusBar().showMessage('Ready')
    self.toolbar = self.addToolBar('Exit')

    exitAction = QtGui.QAction ('Exit', self)
    exitAction.setShortcut('Ctrl+Q')
    exitAction.triggered.connect(QtGui.qApp.quit)

    self.toolbar = self.addToolBar('Exit')
    self.toolbar.addAction(exitAction)

    menubar = self.menuBar() 
    fileMenu = menubar.addMenu('&File')

    self.setGeometry(300, 300, 450, 250)
    self.setWindowTitle('Test')  
    self.setWindowIcon (QtGui.QIcon('logo.png'))
    self.show()

class WinWidget (QtGui.QWidget) : 

def __init__(self, parent): 
    super (WinWidget , self).__init__(parent)
    self.controls()
    #self.__layout()

def controls(self):

    self.qbtn = QtGui.QPushButton('Quit', self)
    self.qbtn.setFixedSize (100,25)
    self.qbtn.setToolTip ("quit")
    self.qbtn.clicked.connect(QtCore.QCoreApplication.instance().quit)
    self.qbtn.move(50, 50)  

def main():

app = QtGui.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())

if __name__ == '__main__':
main()

Upvotes: 6

rainer
rainer

Reputation: 3411

This works :

def menu_bar (self) : 
    self.menuBar = QtGui.QMenuBar (self)
    fileMenu = self.menuBar.addMenu ("File")
    self.menuBar.show()

or already with actions :

def menu_bar (self) : 
    self.menuBar = QtGui.QMenuBar (self)
    fileMenu = self.menuBar.addMenu ("File")
    exitAction = QtGui.QAction(QtGui.QIcon('exit24.png'), 'Exit', self)
    fileMenu.addAction(exitAction)
    exitAction.triggered.connect(self.close)
    exitAction.setShortcut('Ctrl+Q')
    self.menuBar.show()

Upvotes: 4

Bandhit Suksiri
Bandhit Suksiri

Reputation: 3450

OK, I can do !

You just add QtGui.QMenuBar(self) in your QWidget and implement just like QMainWindows.

Reference : Here


Example;

import sys
from PyQt4 import QtGui
class QTestWidget (QtGui.QWidget):
    def __init__ (self):
        super(QTestWidget, self).__init__()
        self.myQMenuBar = QtGui.QMenuBar(self)
        exitMenu = self.myQMenuBar.addMenu('File')
        exitAction = QtGui.QAction('Exit', self)        
        exitAction.triggered.connect(QtGui.qApp.quit)
        exitMenu.addAction(exitAction)

myQApplication = QtGui.QApplication(sys.argv)
myQTestWidget = QTestWidget()
myQTestWidget.show()
myQApplication.exec_()

Regards,

Upvotes: 10

user958119
user958119

Reputation: 63

It will be a good idea to keep using QMainWindow since QMenuBar is designed to be used within it.

That said, I found this post helpful when I was also looking into doing same: Qt QWidget add menubar

See if it's the solution that can help you. It helped me though

Upvotes: 1

Related Questions