pyqt是对Qt的封装。Qt是面向对象的图形用户界面库,可以在多个操作系统上使用。

PyQt基本操作

基本的界面:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/env python
#*-* coding=utf-8 *-*

import sys
from PyQt4 import QtCore, QtGui      # 导入PyQt模块

class MyWindow(QtGui.QMainWindow):    # 通过继承QtGui.QMainWindow创建类

    def __init__(self):           # 初始化方法
        QtGui.QMainWindow.__init__(self) # 调用父类的初始化方法 
        self.setWindowTitle("pyQt")    # 设置窗口标题
        self.resize(400, 600)        # 设置窗口大小

app = QtGui.QApplication(sys.argv)     # 创建QApplication对象
mywindow = MyWindow()             # 创建MyWindow对象
mywindow.show()                # 显示窗口
app.exec_()                  # 进入消息循环

运行效果:

添加一个标签:

PyQt提供了丰富的组件进行GUI编程,可以方便的使用组件,并使用信号/插槽进行组件的通信,处理组件事件。

使用QtGui.QLabel可以创建标签。使用setText方法可以设置标签的文字。使用setTextFormat可以设置中文字的格式。当创建标签后使用QMainWindow 的setCentralWidget方法将标签添加到窗口中。常见的方法:

  • setPicture():设置标签中的图片
  • setText():设置标签中的文字
  • setTextFormat:设置标签文字的格式
  • setAlignment:设置标签中文本的对齐方式

下面将创建一个标签

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#! /usr/bin/env python
# *-* coding=utf-8 *-*

import sys
from PyQt4 import QtCore, QtGui

class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle("Lpb_i")
        set.resize(400, 600)
        #添加标签
        label = QtGui.QLabel("start test")            # 创建标签
        label.setAlignment(QtCore.Qt.AlignCenter)        # 设置标签文字的对齐样式
        self.setCentralWidget(label)                # 向窗口添加标签

app = QtGui.QApplicatin(sys.argv)
demo = Window()
demo.show()
app.exec_()

运行效果:

布局组件和空白项

布局组件

在窗口中使用setCentralWidget只能添加一个组件。如果想添加多个组件,可以使用布局组件。空白项用于占位,配合布局组件更好的控制界面。

布局组件:主要用于控制内部组件的大小、位置等。布局组件可以包含其他的组件,也可以嵌套其他的布局组件。

常见的布局组件:

  • QLayout: 基本的布局组件,只能被继承
  • QHBoxLayout: 横向Box布局组件
  • QVBoxLayout: 竖向Box布局组件
  • QGridLayout: Grid布局组件

布局组件共有的方法:

  • addWidget():添加组件
  • addLayout():添加其他布局组件

下面是一个使用布局组件布置标签的例子。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/env python
# *-* coding=utf-8 *-*

import sys
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):

    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle("Lpb-i")
        self.resize(500, 600

        label1 = QtGui.QLabel("sysbench")   # 创建标签
        label2 = QtGui.QLabel("iozone")
        label3 = QtGui.QLabel("lmbench")
        label4 = QtGui.QLabel("netperf")
        label5 = QtGui.QLabel("pingpong")
        label6 = QtGui.QLabel("unixbench")

        gridLayout = QtGui.QGridLayout()     # 创建网格布局组件

        gridLayout.addWidget(label1, 0,0)  # 向布局中添加标签,第1行第一列
        gridLayout.addWidget(label2, 0,1)
        gridLayout.addWidget(label3, 0,2)
        gridLayout.addWidget(label4, 1,0)
        gridLayout.addWidget(label5, 1,1)
        gridLayout.addWidget(label6, 1,2)

        self.setLayout(gridLayout)    # 设置布局组件

#       添加水平布局
#        hBoxLayout1 = QtGui.QHBoxLayout()   # 创建横向布局组件
#        hBoxLayout1.addWidget(label1)
#        hBoxLayout1.addWidget(label2)
#        hBoxLayout1.addWidget(label3)
#        hBoxLayout1.addWidget(label4)
#        hBoxLayout1.addWidget(label5)
#        hBoxLayout1.addWidget(label6)

#        self.setLayout( hBoxLayout1)

#      添加垂直布局

#         vBoxLayout = QtGui.QVBoxLayout() # 创建垂直布局组件
#         vBoxLayout.addWidget(label1)
#         vBoxLayout.addWidget(label2)
#         vBoxLayout.addWidget(label3)
#         vBoxLayout.addWidget(label4)
#         vBoxLayout.addWidget(label5)
#         vBoxLayout.addWidget(label6)

#         self.setLayout(vBoxLayout)


app = QtGui.QApplication(sys.argv)
demo = Window()
demo.show()
app.exec_()

运行效果:

空白项

PyQt中的空白项可以占据位置,这样就可以更好的布置其他的组件。使用QtGui.QSpaerItem创建空白项,可以使用宽度和高度进行设置。 使用布局组件的addItem方法将其添加到布局组件中。

下面看一个例子: #!/usr/bin/env python # -- coding:utf-8 --

import sys
from PyQt4 import QtCore, QtGui

class MyWindow(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle('test')
        self.resize(300,200)
        gridlayout = QtGui.QGridLayout()  # 创建布局组件
        spacer1 = QtGui.QSpacerItem(300,40) # 创建空白项
        spacer2 = QtGui.QSpacerItem(300,40)
        label = QtGui.QLabel('Label', self)  # 创建标签
        label.setAlignment(QtCore.Qt.AlignCenter) #设置标签文本样式
        gridlayout.addItem(spacer1, 0, 0)  # 添加空白项
        gridlayout.addWidget(label, 1, 0) # 添加标签
        gridlayout.addItem(spacer2, 2, 0)
        self.setLayout(gridlayout)  # 向窗口中添加布局组件

app = QtGui.QApplication(sys.argv)
mywindow = MyWindow()
mywindow.show()
app.exec_()

运行效果:

按钮基本使用

使用PyQt中的QtGui.QPushButton可以创建按钮。在PyQt中按钮事件是以信号/插槽的形式进行的,将按钮事件绑定到类的方法上。

创建按钮

当使用QtGui.QPushButton创建按钮后可以使用一下几种方法设置按钮的样式、属性等。

  • setDefault():将按钮设置为默认按钮
  • setFlat(): 将按钮设置为平坦模式
  • setMenu(): 设置按钮关联的菜单。
  • menu(): 获得按钮关联的菜单

下面例子创建两个按钮

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
# *-* coding=utf-8 *-*

import sys
from PyQt4 import QtGui, QtCore

class Window(QtGui.QWidget):

    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle("Lpb-i")
        self.resize(400,600)
        gridlayout = QtGui.QGridLayout()  # 创建布局组件

        button1 = QtGui.QPushButton("spec2000")  # 生成button1
        gridlayout.addWidget(button1, 0,0,1,3)   # 添加button1

        button2 = QtGui.QPushButton("iozone")  
        button2.setFlat(True)                
        gridlayout.addWidget(button2, 1,1,1,3)
        self.setLayout( gridlayout)    # 向窗口中添加布局组件

app = QtGui.QApplication(sys.argv)
demo = Window()
demo.show()
app.exec_()

运行效果 

信号和信号槽

Qt中的组件使用信号和信号槽的形式来进行通信。Qt的组件中有很多预定义的信号,当事件触发时,组件发出对应的信号。信号被发送给信号槽进行处理。信号槽是处理特定信号的函数。在PyQt同样,需要使用组件的connect方法将组件信号绑定到其处理插槽上。connect方法的原型如下:

connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType)

参数含义如下:

  • QObject: 发送信号的组件
  • SIGNAL(): 组件发送的信号
  • SLOT(): 信号槽函数
  • Qt.ConnectionType: 可选参数,连接类型

下面的例子使用connect方法将按钮的“clicked()"信号连接到事件处理信息槽的函数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys
from PyQt4 import QtCore, QtGui

class MyWindow(QtGui.QWidget):

    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setWindowTitle('test')
        self.resize(300,200)
        gridlayout = QtGui.QGridLayout() # 创建布局组件
        self.button1 = QtGui.QPushButton('Button1')
        gridlayout.addWidget(self.button1, 1, 1, 1, 3)
        self.button2 = QtGui.QPushButton('Button2')
        gridlayout.addWidget(self.button2,2,2)
        self.setLayout(gridlayout)         # 向窗口添加布局组件   
        self.connect(self.button1,                # button1事件
            QtCore.SIGNAL('clicked()'),           # clicked()信号
            self.OnButton1)                       # 信号处理函数
        self.connect(self.button2,       # button2事件
            QtCore.SIGNAL('clicked()'),  # clicked()信号
            self.OnButton2)             # 信号处理函数

    def OnButton1(self):               
        self.button1.setText('clicked')
        print("button1 is cliecked")

    def OnButton2(self):
        self.button2.setText('clicked')
        print("button2 is cliecked")


app = QtGui.QApplication(sys.argv)
mywindow = MyWindow()
mywindow.show()
app.exec_()

运行效果如下:

by 李鹏