PyQt имеет строку состояния и строку меню QWidget


Я пытаюсь создать приложение 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.

Любые предложения о том, как исправить вышеуказанную проблему. Спасибо


person SamAct    schedule 12.07.2016    source источник
comment
@Mailerdaimon QWidget имеет такие функции, как ЖК-дисплей, функции vbox и hbox, которые мне могут понадобиться позже? Меня смущает ваш вопрос, не могли бы вы рассказать мне больше.   -  person SamAct    schedule 12.07.2016
comment
Обычный подход заключается в создании QMainWindow и установке центрального QWidget для этого окна с помощью void QMainWindow::setCentralWidget(QWidget * widget). Плюс: QMainWindow унаследован от QWidget, что означает, что он имеет все возможности QWidget и даже больше.   -  person Mailerdaimon    schedule 12.07.2016
comment
@Mailerdaimon, поэтому QMainWindow имеет все унаследованные функции от QWidget, поэтому его можно использовать. И установка центрального QWidget должна решить мои проблемы. Можете ли вы указать мне какие-либо изменения, которые будут внесены в приведенный выше код?   -  person SamAct    schedule 12.07.2016
comment
Чего вам не хватает, так это добавления qbtn в QMainWindow. Вы можете сделать это напрямую, используя setCentralWidget, или, что я предлагаю, создать новый виджет и установить макет для этого виджета, добавить свой qbtn в макет и установить виджет как центральный виджет. Это позволяет добавлять в главное окно несколько макетов и виджетов.   -  person Mailerdaimon    schedule 12.07.2016


Ответы (3)


Вот рабочее решение, использующее ваш код. Я добавил centralWidget и centralLayout к QMainWindow, который теперь содержит ваш 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()  
person Mailerdaimon    schedule 12.07.2016
comment
Код, кажется, работает нормально, с некоторой тонкой настройкой. Но я не мог заставить кнопку удерживать ее размер, когда мы увеличиваем или уменьшаем размер окна. qbtn.resize(qbtn.sizeHint()), кажется, не имеет никакого влияния на это. Какие-либо изменения, которые я должен внести? - person SamAct; 12.07.2016
comment
Я думаю, что это должен быть новый вопрос. Это облегчает другим людям поиск решения, если у них возникла та же проблема. - person Mailerdaimon; 12.07.2016

Вы можете просто переместить свои кнопки/метки/и т.д. на 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. Надеюсь, это помогло!

person AdrienW    schedule 12.07.2016

Вы также можете использовать комбинацию 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()
person rainer    schedule 15.07.2016