2016-07-12 27 views
4


Ich versuche eine PyQt-Anwendung zu erstellen, die sowohl eine Statusleiste als auch eine Menüleiste mit anderen Widgets im Fenster enthält. Unten ist der Code, den ich es geschafft habe, es mit Klasse QtGui.QMainWindow Methode laufen zu lassen. Aber als ich weitere Funktionen hinzufügen möchte, merke ich, dass ich stattdessen QtGui.QWidget verwenden muss. Hier
PyQt mit Statusleiste und Menüleiste QWidget

ist der Code:

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() 

ich unter dem Eindruck, dass am Menüleiste und Titelleisten erstellt werden können QWidget Methode verwendet, aber hier funktioniert es nicht. Ich beabsichtige, der Anwendung eine LCD-Funktion hinzuzufügen, die QtGui.QLCDNumber verwendet.

Alle Vorschläge zur Behebung des obigen Problems. Danke

+1

@Mailerdaimon QWidget hat Funktionen wie LCD-Display, vbox und hbox Funktionen, die ich später brauchen könnte? Ich bin verwirrt über deine Frage, kannst du mir bitte mehr erzählen. – SamAct

+1

Ein normaler Ansatz besteht darin, ein QMainWindow zu erstellen und ein zentrales QWidget für dieses Fenster mit 'void QMainWindow :: setCentralWidget (QWidget * widget)' zu setzen. Plus: QMainWindow wird von QWidget geerbt, was bedeutet, dass es alle Funktionen eines QWidgets plus mehr hat. – Mailerdaimon

+0

@Mailerdaimon also QMainWindow hat alle geerbten Funktionen von QWidget, so sollte es in Ordnung sein, es zu verwenden. Und wenn Sie ein zentrales QWidget einrichten, sollten Sie meine Probleme beheben. Können Sie mich auf Änderungen hinweisen, die sich auf den obigen Code beziehen? – SamAct

Antwort

2

Hier ist eine funktionierende Lösung mit Ihrem Code. Ich habe eine centralWidget und ein centralLayout zum QMainWindow, die jetzt Ihre qbtn hält:

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() 
+0

Der Code scheint gut zu funktionieren, mit einigen Feinabstimmungen. Aber ich konnte die Drucktaste nicht halten, um ihre Größe zu halten, wie wir die Fenstergröße erhöhen oder verringern. 'qbtn.resize (qbtn.sizeHint())' scheint hier keine Wirkung zu haben. Irgendwelche Änderungen, die ich machen sollte? – SamAct

+0

Ich denke, das sollte eine neue Frage sein.Dies erleichtert es anderen, die Lösung zu finden, wenn sie das gleiche Problem haben. – Mailerdaimon

2

Sie einfach Ihre Tasten/Labels/etc bewegen konnte. zu einem QWidget, und fügen Sie dieses Widget zum Hauptfenster hinzu. So könnte es aussehen (Ich habe die Importe so geändert, dass sie etwas lesbarer sind).

Ihr Inhalt Widget-Klasse:

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 

es zum Hauptfenster hinzufügen:

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() 

Und alles funktioniert nach wie vor außer, dass Sie ein QWidget in dem neuen haben Mitte, anstelle von QMainWindow. Hoffe das hat geholfen!

0

Sie können auch eine Kombination aus QMainWindow und QWidget verwenden.

Ich habe das in einigen Fällen nützlich gefunden. Sie können dem MainWindow-Bereich und den Widgets zum QWidget-Bereich Statusleiste und Menüleiste hinzufügen.

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()