标签:
PyQt的菜单和工具箱
主窗口
QtGui.QMainWindow类提供了一个应用程序主窗口,可以建立一个经典的应用程序框架包括状态栏,工具栏和菜单栏。
1、状态栏
#!/usr/bin/python # -*- coding:utf-8 -*- """ This program creates a statusbar """ import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): self.statusBar().showMessage(‘Ready‘) self.setGeometry(300,300,300,200) self.setWindowTitle(‘Statusbar‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘: main()
为了得到statusbar,调用了QtGui.QMainWindow的statusBar()方法。showMessage()显示statusbar里的消息。
2、菜单栏
菜单栏是GUI应用程序的一部分。一组包含各种指令的菜单。
#!/usr/bin/python # -*- coding:utf-8 -*- """ This program creates a statusbar """ import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): exitAction = QtGui.QAction(QtGui.QIcon(‘icon.png‘),‘&Exit‘,self) exitAction.setShortcut(‘Ctrl+Q‘) exitAction.setStatusTip(‘Exit application‘) exitAction.triggered.connect(QtGui.qApp.quit) self.statusBar() menubar = self.menuBar() fileMenu = menubar.addMenu(‘File‘) fileMenu.addAction(exitAction) self.setGeometry(300,300,300,200) self.setWindowTitle(‘Statusbar‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
上面的例子中,创建了一个只有一个菜单的菜单栏。该菜单包含一个终止程序的动作。同样也创建了一个状态栏。终止程序的动作还包含有一个快捷键。
exitAction = QtGui.QAction(QtGui.QIcon(‘icon.png‘,‘&Exit‘,self) exitAction.setShortcut(‘Ctrl+Q‘) exitAction.setStatusTip(‘Exit application‘)
exitAction.triggered.connect(QtGui.qApp.quit)
当我们选择这个特殊的动作,将触发一个信号发射,这信号被连接到QtGui.QApplication小部件的quit()方法。这将终止这个程序
3.工具栏
菜单组让我们可以在应用程序中使用的命令,工具栏提供了快速访问最常用的命令。
import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): exitAction = QtGui.QAction(QtGui.QIcon(‘icon.png‘),‘&Exit‘,self) exitAction.setShortcut(‘Ctrl+Q‘) exitAction.setStatusTip(‘Exit application‘) exitAction.triggered.connect(QtGui.qApp.quit) self.statusBar().showMessage("This is a program about toolbar") self.toolbar =self.addToolBar(‘Exit‘) self.toolbar.addAction(exitAction) self.setGeometry(300,300,300,200) self.setWindowTitle(‘Statusbar‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘:
【运行结果】
当点击工具栏的图像时,程序可以退出。
跟菜单栏的区别
self.toolbar = self.addToolBar(‘Exit‘) self.toolbar.addAction(exitAction) ------------------------------------------------------ menubar =self.menuBar() fileMenu = menubar.addMenu(‘File‘) fileMenu.addAction(exitAction)
把他们都放在一起
#!/usr/bin/python # -*- coding:utf-8 -*- import sys from PyQt4 import QtGui class Example(QtGui.QMainWindow): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): exitAction = QtGui.QAction(QtGui.QIcon(‘icon.png‘),‘&Exit‘,self) exitAction.setShortcut(‘Ctrl+Q‘) exitAction.setStatusTip(‘Exit application‘) exitAction.triggered.connect(QtGui.qApp.quit) self.statusBar().showMessage("Putting it together") self.toolbar =self.addToolBar(‘Exit‘) self.toolbar.addAction(exitAction) menubar =self.menuBar() fileMenu =menubar.addMenu(‘File‘) fileMenu.addAction(exitAction) self.setGeometry(300,300,300,200) self.setWindowTitle(‘Statusbar‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
【运行结果】
布局管理
在GUI编程中一个重要方面是布局管理,布局管理是如何定位小部件窗口的方式,可以通过两种方式实现,一种是绝对定位,另一种则是采用布局类(Layout)
1.绝对定位
指定设计部件的位置、像素以及每个部件的大小。下面是例子:
#!/usr/bin/python # -*- coding:utf-8 -*- import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): label1 = QtGui.QLabel(‘Label1‘,self) label1.move(15,10) label2 = QtGui.QLabel(‘Label2‘,self) label2.move(35,40) label3 = QtGui.QLabel(‘Label3‘,self) label3.move(55,70) self.setGeometry(300,300,300,200) self.setWindowTitle(‘Absolute‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘: main()
例子中创建了三个标签,并用move()方法移动到指定位置并显示。
2.框布局(Box layout)
布局类可以使界面更加灵活和使用。这是首选的放置小部件的方式。QtGui.QHBoxLayout和QtGui.QVBoxlayout是排列的水平和垂直方向的基本布局类。(horizontally and vertical)
试想一下,假如我们希望把两个按钮防盗右下角。我们会用一个水平布局和一个垂直布局。为了创造足够的空间,我们会增加一个拉伸因子(Stretch factor)。
#!/usr/bin/python # -*- coding:utf-8 -*- import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): okButton = QtGui.QPushButton("OK") cancelButton = QtGui.QPushButton("Cancel") hbox = QtGui.QHBoxLayout() hbox.addStretch(1) hbox.addWidget(okButton) hbox.addWidget(cancelButton) vbox = QtGui.QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300,300,300,150) self.setWindowTitle(‘Buttons‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘: main()
hbox.addStretch(1)
我的理解是像弹簧一个将hox放置于水平方向的尽头,即最右端,参数还不能理解,修改后好像并没有变化
vbox.addStretch(1)
vbox.addLayout(hbox)
同理,首先vbox添加hbox的布局,再用addStrtch()将其放置于最下方。
3.网格布局(Grid Layout)
最普遍的布局类是网格布局,网格布局将该空间分为行和列。要使用网格布局,需要使用QtGui.QGridLayout()。
#!/usr/bin/python/ # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example,self).__init__() self.initUI() def initUI(self): grid = QtGui.QGridLayout() self.setLayout(grid) names =[‘Cls‘,‘Bck‘,‘ ‘,‘Close‘, ‘7‘,‘8‘,‘9‘,‘/‘, ‘4‘,‘5‘,‘6‘,‘*‘, ‘1‘,‘2‘,‘3‘,‘-‘, ‘0‘,‘.‘,‘=‘,‘+‘] positions =[(i,j) for i in range(5) for j in range(4)] for position,name in zip(positions,names): if name == ‘ ‘: continue button = QtGui.QPushButton(name) grid.addWidget(button,*position) self.move(300,150) self.setWindowIcon(QtGui.QIcon(‘icon.png‘)) self.setWindowTitle(‘Calcalator‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ ==‘__main__‘:
【运行结果】
在例子中,创建了一系列网格按钮,然后用Label控件进行充填。
grid = QtGui.QGridLayout()
self.setLayout(grid)
一个QtGui.QGridLayout的实例被创建,并设置为应用窗口的布局。
names = [‘Cls‘, ‘Bck‘, ‘‘, ‘Close‘, ‘7‘, ‘8‘, ‘9‘, ‘/‘, ‘4‘, ‘5‘, ‘6‘, ‘*‘, ‘1‘, ‘2‘, ‘3‘, ‘-‘, ‘0‘, ‘.‘, ‘=‘, ‘+‘]
这些都被用作Label标签的名称。
positions =[(i,j) for i in range(5) for j in range(4)]
网格的列表数列。
for position, name in zip(positions, names): if name == ‘‘: continue button = QtGui.QPushButton(name) grid.addWidget(button, *position)
按钮被创建和添加到布局中,使用addWidget()。
【zip函数接受任意多个(包括0个和1个)序列作为参数】
4.例子
Widgets可以在网格中跨越多个行和列。
#!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.initUI() def initUI(self): title = QtGui.QLabel(‘Title‘) author = QtGui.QLabel(‘Author‘) review = QtGui.QLabel(‘Review‘) titleEdit = QtGui.QLineEdit() authorEdit = QtGui.QLineEdit() reviewEdit = QtGui.QTextEdit() grid = QtGui.QGridLayout() grid.setSpacing(10) grid.addWidget(title, 1, 0) grid.addWidget(titleEdit, 1, 1) grid.addWidget(author, 2, 0) grid.addWidget(authorEdit, 2, 1) grid.addWidget(review, 3, 0) grid.addWidget(reviewEdit, 3, 1, 5, 1) self.setLayout(grid) self.setGeometry(300, 300, 350, 300) self.setWindowTitle(‘Review‘) self.show() def main(): app = QtGui.QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == ‘__main__‘: main()
【运行结果】
grid = QtGui.QGridLayout()
grid.setSpacing(10)
创建的小部件之间的距离。
grid.addWidget(reviewEdit, 3, 1, 5, 1)
标签:
原文地址:http://www.cnblogs.com/thenewone/p/5023718.html