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_()
|
运行效果如下: