控件是构建应用程序的基本模块,PyQt5 提供各种各样的控件,包括标签、按钮、编辑框、复选框、滑动条、列表框等等。本节课,我们将详细介绍几个常用的控件:QLabel、QPixmap、QLineEdit、QSplitter、QComboBox。
QLabel 是我们最常用的控件之一,其功能很强大,我们可以用来显示文本,html超文本,链接,图片和动画等。
import sys from PyQt5.QtWidgets import QApplication, QLabel, QWidget from PyQt5.QtGui import QPixmap, QMovie class LableExample(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 创建4个标签 self.label1 = QLabel(self) # 文本标签 self.label2 = QLabel(self) # 超文本标签 self.label3 = QLabel(self) # 链接标签 self.label4 = QLabel(self) # 图片标签 self.label5 = QLabel(self) # 动画标签 self.label1.move(100, 50) self.label2.move(100, 100) self.label3.move(100, 150) self.label4.move(100, 200) self.label5.move(300, 200) self.label1.setText('这是一个文本标签') self.label2.setText('<strong style="color:#ff0000">欢迎来学习python</strong>') self.label3.setText('<a href="www.birdpython.com">老鸟python官网</a>') self.label3.setOpenExternalLinks(True) # 点击超链接可以打开网页 pic = QPixmap("res/img/birdpython.png") # 确保当前目录下有该图片文件 self.label4.setPixmap(pic) # 把图片加入标签 movie = QMovie("test.gif") # 确保当前目录下有该动画文件 self.label5.setMovie(movie) # 把动画加入标签 movie.start() # 播放动画 self.setGeometry(600, 200, 800, 500) self.setWindowTitle('标签') self.show() app = QApplication(sys.argv) ex = LableExample() app.exec_()
QPixmap 类用于绘图设备的图像显示,它可以作为一个 QPaintDevice 对象,也可以加载到一个控件中,通常是标签或按钮,用于在标签或按钮上显示图像。QPixmap 可以读取的图像文件类型有 BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM 等。刚刚上个例子我们在标签上显示了图片,这次我们在一个按钮上显示图片。
import sys from PyQt5.QtGui import QPixmap, QIcon from PyQt5.QtWidgets import (QWidget, QPushButton, QApplication) from PyQt5.QtCore import QSize class PixmapExample(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): pixmap = QPixmap("birdpython.png") # 确保当前目录下有该图片 self.btn = QPushButton(self) self.btn.setIcon(QIcon(pixmap)) # 需要用 QIcon 转换一下 self.btn.setGeometry(100, 200, 100, 50) # 设置按钮显示位置和大小 self.btn.setIconSize(QSize(100, 50)) # 设置按钮上的图片大小 self.setWindowTitle('画布') self.setGeometry(600, 200, 800, 500) self.show() app = QApplication(sys.argv) ex = PixmapExample() app.exec_()
QLineEdit 叫编辑框也叫文本框,它是用于输入或编辑单行文本的控件,它还有撤销重做、剪切复制和拖拽功能。
import sys from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QApplication) class LineEditExample(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lb = QLabel(self) self.le = QLineEdit(self) self.lb.move(60, 40) self.le.move(60, 100) self.le.textChanged[str].connect(self.onChanged) self.setGeometry(600, 200, 800, 500) self.setWindowTitle('编辑框') self.show() def onChanged(self, text): self.lb.setText(text) self.lb.adjustSize() app = QApplication(sys.argv) ex = LineEditExample() app.exec_()
通过 QSplitter,用户可以拖动子控件边界来调整子控件的尺寸。在下面的示例中,我们展示了三个由两个 QSplitter 组织的 QFrame 控件。
import sys from PyQt5.QtCore import Qt from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QFrame, QSplitter, QApplication) class SplitterExample(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): hbox = QHBoxLayout(self) # 布局控件 topleft = QFrame(self) # 左边的边框 topleft.setFrameShape(QFrame.StyledPanel) topright = QFrame(self) # 右边的边框 topright.setFrameShape(QFrame.StyledPanel) bottom = QFrame(self) # 底端的边框 bottom.setFrameShape(QFrame.StyledPanel) splitter1 = QSplitter(Qt.Horizontal) # 分割器 1 splitter1.addWidget(topleft) splitter1.addWidget(topright) splitter2 = QSplitter(Qt.Vertical) # 分割器 2 splitter2.addWidget(splitter1) splitter2.addWidget(bottom) hbox.addWidget(splitter2) self.setLayout(hbox) self.setGeometry(600, 200, 800, 500) self.setWindowTitle('QSplitter') self.show() app = QApplication(sys.argv) ex = SplitterExample() app.exec_()
示例中我们创建了三个 QFrame 与两个 QSplitter,注意在某些主题中这些 QSplitter 可能会不可见。另外,QHBoxLayout 是一个布局网格控件,可以对在此网格内的控件进行布局。
QComboBox 其实就是把一个编辑框和一个列表框组合到了一起,组合框也叫下拉列表框,组合框可以是可编辑的,允许用户修改列表中的每个项目。
import sys from PyQt5.QtWidgets import (QWidget, QLabel, QComboBox, QApplication) class ComboBoxExample(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lb = QLabel("老鸟python", self) self.combo = QComboBox(self) self.combo.addItem("python3教程") self.combo.addItem("设计模式教程") self.combo.addItem("Django教程") self.combo.addItem("爬虫教程") self.combo.addItem("人工智能教程") self.combo.addItem("自动化教程") self.combo.move(50, 50) self.lb.move(50, 200) self.combo.activated[str].connect(self.onActivated) self.setGeometry(600, 200, 800, 500) self.setWindowTitle('组合框') self.show() def onActivated(self, text): self.lb.setText(text) self.lb.adjustSize() app = QApplication(sys.argv) ex = ComboBoxExample() app.exec_()
示例中展示了一个 QComboBox 与一个 QLabel,QComboBox 控件中有 6 个选项,当选中某个选项时会调用 onActivated 方法。另外,我们让 QLabel 控件显示 QComboBox 中选中的某个选项。
熟练掌握本节介绍的各种控件。
做一个对话框,把本节课讲的所有控件都显示出来。
一看就会,明白易懂,我现在很想做个好用的界面程序了