码迷,mamicode.com
首页 > 其他好文 > 详细

PyQt(2)

时间:2015-12-06 15:55:45      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:

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)

PyQt(2)

标签:

原文地址:http://www.cnblogs.com/thenewone/p/5023718.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!