PyQt有一个状态栏&菜单栏QWidget

时间:2016-07-12 07:18:34

标签: python qt pyqt qwidget qmainwindow


我正在尝试创建一个PyQt应用程序,该应用程序在窗口中同时具有状态栏和菜单栏以及其他窗口小部件。下面是我设法使用类QtGui.QMainWindow方法运行的代码。但是,当我打算添加更多功能时,我意识到我必须使用QtGui.QWidget代替。

以下是代码:

import sys
from PyQt4 import QtGui, QtCore

### How can I use QtGui.QWidget here??? ###

class Example(QtGui.QMainWindow):                                  
     def __init__(self):
          super(Example, self).__init__()
          self.initUI()

     def initUI(self):               

        QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))    
        self.setToolTip('This is a <b>QWidget</b> Window widget')

        exitAction = QtGui.QAction(QtGui.QIcon('exit-icon-2.png'), '&Exit', self)

        exitAction.setShortcut('Ctrl+Q')                        
        exitAction.setStatusTip('Exit/Terminate application')   

        exitAction.triggered.connect(QtGui.qApp.quit)           

        self.statusBar()                                       

        menubar = self.menuBar()                                
        menubar.setToolTip('This is a <b>QWidget</b> for MenuBar')                                

        fileMenu = menubar.addMenu('&File')                     
        fileMenu.addAction(exitAction)                          
        toolbar = self.addToolBar('Exit')                       
        toolbar.addAction(exitAction)                           

        qbtn = QtGui.QPushButton('Quit', self)                  

        qbtn.setToolTip('This is a <b>QPushButton</b> widget')  
        qbtn.clicked.connect(self.launchAAA)                    
        qbtn.resize(qbtn.sizeHint())                           
        qbtn.move(170, 190)                                     



        self.setGeometry(500, 180, 400, 400)                    
        self.setWindowTitle('Quit button with Message')        
        self.show()                                            

    def launchAAA(self, event):

        reply = QtGui.QMessageBox.question(self, 'Message',
        "Are you sure to quit?", QtGui.QMessageBox.Yes | 
        QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:  
           QtGui.QApplication.quit()
        else:
           pass                                              


def main():

   app = QtGui.QApplication(sys.argv)                          
   ex=Example()

   sys.exit(app.exec_())                                       


if __name__ == '__main__':
   main()  

我的印象是菜单栏和标题栏可以使用QWidget方法创建,但在这里它不起作用。我打算使用QtGui.QLCDNumber为应用程序添加一个LCD功能。

有关如何解决上述问题的任何建议。感谢

3 个答案:

答案 0 :(得分:3)

您可以移动按钮/标签/等。到QWidget,并将此小部件添加到主窗口。这是它的样子(我更改了导入,使其更具可读性)。

您的内容窗口小部件类:

class ExampleContent(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self, parent)
        self.initUI()

    def initUI(self):        
        qbtn = QPushButton('Quit', self)
        qbtn.setToolTip('This is a <b>QPushButton</b> widget')
        qbtn.clicked.connect(self.launchAAA)                 
        qbtn.resize(qbtn.sizeHint())                           
        qbtn.move(170, 190)

    def launchAAA(self):
        reply = QMessageBox.question(self, 'Message',
        "Are you sure to quit?", QMessageBox.Yes | 
        QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:  
            QApplication.quit()
        else:
            pass

将其添加到主窗口:

class Example(QMainWindow):                                  
    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):               
        QToolTip.setFont(QFont('SansSerif', 10))
        self.setToolTip('This is a <b>QWidget</b> Window widget')

        exitAction = QAction(QIcon('exit-icon-2.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit/Terminate application')
        exitAction.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()        
        menubar.setToolTip('This is a <b>QWidget</b> for MenuBar')

        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)
        toolbar = self.addToolBar('Exit')
        toolbar.addAction(exitAction)

        # create the widget here
        content = ExampleContent(self)
        self.setCentralWidget(content)

        self.setGeometry(500, 180, 400, 400)     
        self.setWindowTitle('Quit button with Message')
        self.show()

一切都像以前一样工作,除了你新的中间有一个QWidget,而不是QMainWindow。希望有所帮助!

答案 1 :(得分:2)

这是一个使用您的代码的工作解决方案。我在centralWidget添加了centralLayoutQMainWindow,现在保留了qbtn

import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QMainWindow):                                  
     def __init__(self):
          super(Example, self).__init__()
          self.initUI()

     def initUI(self):               

        QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10))    
        self.setToolTip('This is a <b>QWidget</b> Window widget')

        exitAction = QtGui.QAction(QtGui.QIcon('exit-icon-2.png'), '&Exit', self)

        exitAction.setShortcut('Ctrl+Q')                        
        exitAction.setStatusTip('Exit/Terminate application')   

        exitAction.triggered.connect(QtGui.qApp.quit)           

        self.statusBar()                                       

        menubar = self.menuBar()                                
        menubar.setToolTip('This is a <b>QWidget</b> for MenuBar')                                

        fileMenu = menubar.addMenu('&File')                     
        fileMenu.addAction(exitAction)                          
        toolbar = self.addToolBar('Exit')                       
        toolbar.addAction(exitAction)                        

        # Create a central Widgets
        centralWidget = QtGui.QWidget()

        # Create a Layout for the central Widget
        centralLayout = QtGui.QHBoxLayout()



        qbtn = QtGui.QPushButton('Quit', self)                  

        qbtn.setToolTip('This is a <b>QPushButton</b> widget')  
        qbtn.clicked.connect(self.launchAAA)                    
        qbtn.resize(qbtn.sizeHint())                           
        qbtn.move(170, 190)      

        # Add the Button to the Layout
        centralLayout.addWidget(qbtn)  

        # Set the Layout
        centralWidget.setLayout(centralLayout)

        # Set the Widget
        self.setCentralWidget(centralWidget)     

        self.setGeometry(500, 180, 400, 400)                    
        self.setWindowTitle('Quit button with Message')        
        self.show()                                            

     def launchAAA(self, event):

        reply = QtGui.QMessageBox.question(self, 'Message',
        "Are you sure to quit?", QtGui.QMessageBox.Yes | 
        QtGui.QMessageBox.No, QtGui.QMessageBox.No)

        if reply == QtGui.QMessageBox.Yes:  
           QtGui.QApplication.quit()
        else:
           pass                                              


def main():

   app = QtGui.QApplication(sys.argv)                          
   ex=Example()

   sys.exit(app.exec_())                                       


if __name__ == '__main__':
   main()  

答案 2 :(得分:0)

您还可以使用QMainWindow和QWidget的组合。

我发现在某些情况下这很有用。您可以将状态栏和菜单栏添加到MainWindow部分,将小部件添加到QWidget区域。

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.setGeometry(300, 300, 450, 250)
    self.setWindowTitle('Test')  
    self.setWindowIcon (QtGui.QIcon('logo.png'))
    self.show()

    self.win_widget = WinWidget (self)



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. clicked.connect(QtCore.QCoreApplication.instance().quit)
    self.qbtn.setFixedSize (100,25)
    self.qbtn.move(50, 50)  


def main():

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

if __name__ == '__main__':
main()