文章目录
模块
QtCore:包含了核心的非GUI功能。此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。
QtGui包含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本。
qtwidgets模块包含创造经典桌面风格的用户界面提供了一套UI元素的类。
QtMultimedia包含的类来处理多媒体内容和API来访问相机和收音机的功能。
Qtbluetooth模块包含类的扫描设备和连接并与他们互动。描述模块包含了网络编程的类。这些类便于TCP和IP和UDP客户端和服务器的编码,使网络编程更容易和更便携。
Qtpositioning包含类的利用各种可能的来源,确定位置,包括卫星、Wi-Fi、或一个文本文件。
Enginio模块实现了客户端库访问Qt云服务托管的应用程序运行时。
Qtwebsockets模块包含实现WebSocket协议类。
QtWebKit包含一个基于Webkit2图书馆Web浏览器实现类。
Qtwebkitwidgets包含的类的基础webkit1一用于qtwidgets应用Web浏览器的实现。
QtXml包含与XML文件的类。这个模块为SAX和DOM API提供了实现。
QtSvg模块提供了显示SVG文件内容的类。可伸缩矢量图形(SVG)是一种描述二维图形和图形应用的语言。
QtSql模块提供操作数据库的类。
QtTest包含的功能,使pyqt5应用程序的单元测试
QWidget控件是PyQt5中所有用户界面的父类,QWidget对象创建成为一个应用的顶层窗口。这里使用了没有参数的默认构造函数,它没有父类,我们称没有父类的控件为窗口。
QWidget运行后就只有一个“页面”,而QMainWindow运行后生成了一个“窗口”。
QMainWindow的布局如下图所示:
从外到内依次是菜单栏、状态栏、工具栏、停靠窗口、中心窗口。
查看帮助文档可以发现,setMenuBar、addToolBar、setCentralWidget、setStatusBar几种行为只有QMainWindow类具有。
因此,在继承自QWidget类的用户类中无法创建菜单栏等几种行为。
这就是QMainWindow和QWidget的主要区别。
可在下面网页查找QT的类及包含的函数
http://www.kuqin.com/qtdocument/classes.html
布局
布局就是如何管理应用中的元素和窗口。有两种方式可以搞定:绝对定位和PyQt5的layout类
绝对定位
每个程序都是以像素为单位区分元素的位置,衡量元素的大小。所以我们完全可以使用绝对定位搞定每个元素和窗口的位置。
局限性:
- 元素不会随着我们更改窗口的位置和大小而变化。
- 不能适用于不同的平台和不同分辨率的显示器
- 更改应用字体大小会破坏布局
- 如果我们决定重构这个应用,需要全部计算一下每个元素的位置和大小
例
import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI():
label1=QLabel('hello',self)
label1.move(10,10)
#用move()方法定位了每一个元素,使用x、y坐标。x、y坐标的原点是程序的左上角。
label2=QLabel('world',self)
label2.move(25,25)
self.setGeometry(300, 300, 250, 150)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
效果图
栅格布局
QGridLayout模块
实例:创建计算器
import sys
from PyQt5.QtWidgets import (QWidget, QGridLayout,
QPushButton, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#建立网格
grid = 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 = QPushButton(name)
grid.addWidget(button, *position)
self.move(300, 150)
self.setWindowTitle('Calculator')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
提交反馈信息
QLineEdit 行编辑
def findtriggered(self):#查找
findDlg = QDialog(self)
findDlg.setWindowTitle('查找...')
self.find_textLineEdit = QLineEdit(findDlg)#行编辑
find_next_button = QPushButton('查找下一个', findDlg)
find_last_button = QPushButton('查找上一个', findDlg)
v_layout = QVBoxLayout(self)#垂直布局
v_layout.addWidget(find_last_button)#加入按钮
v_layout.addWidget(find_next_button)
h_layout = QHBoxLayout(findDlg)#水平布局
h_layout.addWidget(self.find_textLineEdit)加入行编辑
h_layout.addLayout(v_layout)
find_last_button.clicked.connect(self.findLast)#对应时间
find_next_button.clicked.connect(self.findNext)
findDlg.show()
事件
在事件模型中,有三个角色:
- 事件源 : 发生了状态改变的对象。
- 事件 : 这个对象状态改变的内容。
- 事件目标 : 事件想作用的目标。
作用机制:事件源绑定事件处理函数,然后作用于事件目标身上
PyQt5处理事件方面有个signal and slot机制。Signals and slots用于对象间的通讯。事件触发的时候,发生一个signal,slot是用来被Python调用的。
例:
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
QVBoxLayout, QApplication)
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lcd = QLCDNumber(self)
sld = QSlider(Qt.Horizontal, self)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(sld)
self.setLayout(vbox)
sld.valueChanged.connect(lcd.display)
#上式中,中间参数可变,括号内为连接的相应的变化的值(可为函数,需自己另定义),即当sld变化时,lcd的值相应变化
#switch.triggered.connect(self.switchtriggered) 此代码中,中间参数变化,因前面switch对应类型为QAction
#redb.clicked.connect(self.setColor) redb对应为QPushButton
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Signal and slot')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
菜单栏和工具栏 状态栏
模块
QtWidget
QtGui
menuBar() 返回主窗口的QMenuBar对象
addMenu() 在菜单栏中添加一个新的QMenu对象
addAction() 向QMenu小控件中添加一个操作按钮,其中包含文本或图标
setEnabled() 将操作按钮设置为启用/禁用
addSeperator() 在菜单中添加一条分割线
clear() 删除菜单栏的内容
setShortcut() 将快捷键关联到操作按钮
setText() 设置菜单项的文本
setTitle() 设置QMenu小控件的标题
text() 返回与QACtion对象关联的文本
完整例子见 例
菜单栏
树状菜单
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow,QAction,qApp,QMune
class Example(QMainWindow):
def __init__(self,parent=None):
super().__init__()
self.initUI()
def initUI(self):
#实例化主窗口的QMenuBar对象
bar=self.menuBar()
#向菜单栏中添加新的QMenu对象,父菜单
file=bar.addMenu('File')
#向QMenu小控件中添加按钮,子菜单
new=file.addAction(QIcon('New'))
#添加孙菜单
form=bar.addMenu('格式(O)')
newitch.addAction('open')
勾选菜单
#创建勾选菜单
close=QAction('关闭',self,checkable=True)
close.setChecked(True)#默认状态
close.triggered.connect(self.close)#响应事件
bar.addAction(close)
右键菜单
#创建右键菜单
def contextMenuEvent(self, event):
cmenu = QMenu(self)
newAct = cmenu.addAction("New")
opnAct = cmenu.addAction("Open")
quitAct = cmenu.addAction("Quit")
action = cmenu.exec_(self.mapToGlobal(event.pos()))
if action == quitAct:
qApp.quit()
QT菜单图标不显示
self.setWindowIcon(QIcon('c://users/53877/desktop/7.png'))
#地址为'//'而非'/',否则易出现'unicodeescape' codec can't decode bytes in position’错误,只需保证不出现‘/u’即可,复制的地址中为'\',可能无法显示图标
准确确认,该图片文件是否是一个合法的图标。
图像和图标之间是有比较大区别的
工具栏
#添加工具栏
toolbar=self.addToolBal('save')
toolbar.addAction(save)
例
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow,QAction,qApp,QMune
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self,parent=None):
super().__init__()
self.initUI()
def initUI(self):
#实例化主窗口的QMenuBar对象
bar=self.menuBar()
#向菜单栏中添加新的QMenu对象,父菜单
file=bar.addMenu('File')
#向QMenu小控件中添加按钮,子菜单
new=file.addAction(QIcon('New'))
#添加孙菜单
form=bar.addMenu('格式(O)')
newitch.addAction('open')
#创建勾选菜单
close=QAction('关闭',self,checkable=True)
close.setChecked(True)#默认状态
close.triggered.connect(self.close)#响应事件
bar.addAction(close)
#定义响应小控件按钮,并设置快捷键关联到操作按钮,添加到父菜单下
savesw=QAction('Save',self)
save.setShortcut('Ctrl+S')
file.addAction(save)
#添加工具栏
toolbar=self.addToolBal('save')
toolbar.addAction(save)
#添加父菜单(包括父菜单图标)
quit=QAction(QIcon('quit.jpg'),'Quit',self)
#添加状态
quit.setStatusTip('退出')
file.addAction(quit)
#工具栏
quitbar=self.addToolBar('save')
quirbar.addAction(quit)
#单击任何Qmenu对象,都会发射信号,绑定槽函数
file.triggered[QAction].connect(self.processtrigger)
#设置布局及标题
self.setLayout(layout)
self.setWindowTitle('menu例子')
#创建右键菜单
def contextMenuEvent(self, event):
cmenu = QMenu(self)
newAct = cmenu.addAction("New")
opnAct = cmenu.addAction("Open")
quitAct = cmenu.addAction("Quit")
action = cmenu.exec_(self.mapToGlobal(event.pos()))
if action == quitAct:
qApp.quit()
def processtrigger(self,q):
#输出那个Qmenu对象被点击
print(q.text()+'is triggeres')
if __name__ == '__main__':
app=QApplication(sys.argv)
ex=example()
sys.exit(app.exec_())
创建编辑文本
import sys
from PyQt5.QtWidgets import QMainWindow, QTextEdit, QAction, QApplication
from PyQt5.QtGui import QIcon
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#创建了一个文本编辑区域,并把它放在QMainWindow的中间区域。这个组件或占满所有剩余的区域。
textEdit = QTextEdit()
self.setCentralWidget(textEdit)
self.setGeometry(300, 300, 350, 250)
self.setWindowTitle('Main window')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
打开文件
Qwidget 中QFileDialog
def opentriggered(self):#打开文件
fname = QFileDialog.getOpenFileName(self, 'Open file', '')
if fname[0]:
with open(fname[0],'r',encoding='gb18030',errors='ignore') as f:
data = f.read()
self.textEdit.setText(data)
#gb18030 简体中文字符编码
颜色 字体 时间和日期
颜色 字体
调用类 QFontDialog QColorDialog等
from PyQt5.QtWidgets import (QWidget, QPushButton, QFrame,
QColorDialog, QApplication,QFontDialog,QFont)
from PyQt5.QtGui import QColor
import sys
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
#设置按钮并关联函数
self.bt1 = QPushButton('选择字体',self)
self.bt1.move(350,70)
self.bt2 = QPushButton('选择颜色',self)
self.bt2.move(350,120)
self.bt1.clicked.connect(self.choicefont)
self.bt2.clicked.connect(self.choicecolor)
def choicefont(self): #FontDialog函数的运用
font, ok = QFontDialog.getFont()
if ok:
self.tx.setCurrentFont(font)
def choicecolor(self):
col = QColorDialog.getColor()
if col.isValid():
self.tx.setTextColor(col)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
时间 日期
QDate QTime QDateTime
这QDate是一个在格里高利历中使用日历日期的类。它具有确定日期,比较或操纵日期的方法。该QTime课程以时钟时间工作。它提供了比较时间,确定时间和各种其他时间操纵方法的方法。这QDateTime是一个将两个 对象QDate和QTime对象组合成一个对象的类。
from PyQt5.QtWidgets import QMianWindow,QDate,QTime,QDateTime
class Example(QMainWindow):
fileName='./newFile.txt'
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.textEdit = QTextEdit()
self.setCentralWidget(self.textEdit)
self.setGeometry(300, 300, 1500, 1200)
now=QDateTime.currentDateTime()
self.textEdit.append(now.toString())
date=QDate.currentDate()
self.textEdit.apped(date.toString())
time=QTime.currentTime()
self.textEdit.append(time.toString())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
控件
复选框
QCheckBox复选框控件,它有两个状态:打开和关闭,他是一个带有文本标签(Label)的控件。复选框常用于表示程序中可以启用或禁用的功能。
def initUI(self):
cb = QCheckBox('Show title', self)#设置按钮
cb.move(20, 20)#布局
cb.toggle()
cb.stateChanged.connect(self.changeTitle)#响应函数
def changeTitle(self, state):
if state == Qt.Checked:
self.setWindowTitle('QCheckBox')
else:
self.setWindowTitle(' ')
下拉选框
QComboBox组件能让用户在多个选择项中选择一个。
def initUI(self):
self.lbl = QLabel("Ubuntu", self)
combo = QComboBox(self)#生成选框
combo.addItem("Ubuntu")#加入选项
combo.addItem("Mandriva")
combo.addItem("Fedora")
combo.addItem("Arch")
combo.addItem("Gentoo")
combo.move(50, 50)
self.lbl.move(50, 150)
combo.activated[str].connect(self.onActivated)
切换按钮
QPushButton的一种特殊模式(多个按钮)。 它只有两种状态:按下和未按下。我们再点击的时候切换两种状态,有很多场景会使用到这个功能。
def initUI(self):
self.col = QColor(0, 0, 0)
#生成三个按钮,相互之间切换
redb = QPushButton('Red', self)
redb.setCheckable(True)
redb.move(10, 10)
redb.clicked[bool].connect(self.setColor)
greenb = QPushButton('Green', self)
greenb.setCheckable(True)
greenb.move(10, 60)
greenb.clicked[bool].connect(self.setColor)
blueb = QPushButton('Blue', self)
blueb.setCheckable(True)
blueb.move(10, 110)
blueb.clicked[bool].connect(self.setColor)
滑块
QSlider是个有一个小滑块的组件,这个小滑块能拖着前后滑动,这个经常用于修改一些具有范围的数值,比文本框或者点击增加减少的文本框(spin box)方便多了。音量标识也可用此。
def initUI(self):
sld = QSlider(Qt.Horizontal, self)#生成滑块
sld.setFocusPolicy(Qt.NoFocus)#设定滑块的聚焦模式
sld.setGeometry(30, 40, 100, 30)
sld.valueChanged.connect(self.changeValue)
def changeValue(self, value):
if value == 0:
#自行添加动作
elif value > 0 and value <= 30:
elif value > 30 and value < 80:
else:
图片编辑
QPixmap是处理图片的组件。
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
hbox = QHBoxLayout(self)
pixmap = QPixmap("redrock.png")#创建一个QPixmap对象,用pixmap接受
lbl = QLabel(self)#创建标签
lbl.setPixmap(pixmap)#将图片放入标签
hbox.addWidget(lbl)#创建窗口
self.setLayout(hbox)
self.move(300, 200)
self.setWindowTitle('Red Rock')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
行编辑
QLineEdit
qle = QLineEdit(self)
qle.textChanged.connect(self.onChanged)
文本编辑
QTextEdit
self.textEdit = QTextEdit()
self.setCentralWidget(self.textEdit)