Pyqt5之窗口部件
简介
QtDesigner提供的默认基类只有 QMainWindow、QWidget 和 QDialog 这3种。QMainWindow 是带有菜单栏和工具栏的主窗口类,QDialog 是各种对话框的基类,而它们全部继承自 QWidget。不仅如此,其实所有的窗口部件都继承自 QWidget,如下图所示(QT的类图)
一、基础窗口部件 QWidget
1.1 窗口与窗口部件
QWidget 类是所有用户界面对象的基类,被称为基础窗口部件。在图3-1中可以 看到,QWidget 继承自 QObject 类和 QPaintDevice 类,其中 QObject 类是所有支持Qt对象模型(Qt Object Model)的基类,QPaimDevice 类是所有可以绘制的对象的基类。QMainWindow:可以包含菜单栏、工具栏、状态栏和标题栏,是最常见的窗口形式
QDialog:是对话窗口的基类。没有菜单栏、工具栏、状态栏。
QWidget:不确定窗口的用途,就使用QWidget。
先来看一个例子,如下是Python代码
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class AppGui(QWidget):
def __init__(self):
super(AppGui, self).__init__()
self.initUI()
def initUI(self):
# self无父窗口,不是窗口部件,而是个窗口
self.setWindowTitle("我是widget")
# label1 无父窗口,是个窗口
self.label1 = QLabel("我是个窗口")
self.label1.setText("label:我是个窗口")
# label2指定了父窗口为widget(self),所以是widget的窗口部件,而不是窗口
label2 = QLabel(self)
label2.setText("我不是独立窗口,只是widget的子部件")
if __name__ == '__main__':
# 创建应用程序
app = QApplication(sys.argv)
# 在应用程序里创建窗口
ui = AppGui()
# 显示窗口
ui.show()
ui.label1.show()
# 进入程序的主循环、并通过exit函数确保主循环安全结束
sys.exit(app.exec_())
程序中定义了一个 QWidget 类对象 widget 和两个 QLabel 对象 labe1 与 label2 ,其中 labe1 没有父窗口,而 label2 在 widget 中, widget 是其父窗口。然后运行程序,效果如下图所示。
窗口部件(Widget):这里简称部件,是 Qt 中建立用户界面的主要元素。像主窗口、对话框、标签、还有以后要介绍到的按钮、文本输人框等都是窗口部件。
Qt 中把没有嵌入到其他部件中的部件称为窗口,一般窗口都有边框和标题栏,就像程序中的 widget 和 label1 —样。QMainWindow 和大量的 QDialog 子类是最一般的窗口类型。窗口就是没有父部件的部件,所以又称为顶级部件。与其相对的是非窗口部件,又称为子部件。
1.2 窗口几何布局
对于一个窗口,往往要设置它的大小和运行时出现的位置,这就是本小节要说的窗口几何布局。对于窗口的大小和位置,根据是否包含边框和标题栏两种情况,要用不同的函数来获取。可以在帮助索引中查看Window and Dialog Widgets关键字,文档中显示了窗口的几何布局图,如下图所示。
二、其他窗口部件
2.1 QFrame 类族
QFrame 类是带有边框的部件的基类,它的子类有最为常用的标签部件 QLabel,另外还有 QLCDNumber、QSplitter、QStackedWidget等
带边框部件最主要的特点就是可以有一个明显的边界框架。QFrame 类的主要功能也就是用来实现不同的边框效果,这主要是由边框形状(Shape)和边框阴影(Shadow)组合来形成的。 QFrame 类中定义的主要边框形状如下图1和图2所示。其中,lineWidth 是边框边界的线的宽度;而 midLineWidth 是在边框中额外插入的一条线的宽度,作用是形成3D效果,并且只在Box、Hline和VLine表现为凸起或者凹陷时有用。QFrame 的这些元素组合成的所有边框效果,如下图3所示。
图片都是java类,不过是一样的
下面要讲的部件都是QFrame类的子类,也都是Qt的标准部件,所以大多会在Qt设计器中直接设置其属性。能在属性栏中设置的属性,其类中就一定有相关的函数可以使用代码来实现, 只要根据名字在类的参考文档中查找就可以了。
(1)QLabel
标签 QLabel 部件用来显示文本或者图片。在设计器中往界面拖人一个 Label,然后将其拖大,并在属性栏中设置其对齐方式为 alignment 属性,水平的改为 AlignHCenter,垂直的改为AlignVCenter,这样 QLabel 中的文本就会显示在正中间。属性栏中还有一个 wordwrap,选中它就可以实现文本的自动换行。下面看一下怎么在标签中使用图片。
'''
QLabel控件
setAlignment():设置文本的对齐方式
setIndent():设置文本缩进
text():获取文本内容
setBuddy():设置伙伴关系
setText():设置文本内容
selectedText():返回所选择的字符
setWordWrap():设置是否允许换行
QLabel常用的信号(事件):
1. 当鼠标滑过QLabel控件时触发:linkHovered
2. 当鼠标单击QLabel控件时触发:linkActivated
'''
import sys
from PyQt5.QtWidgets import QVBoxLayout,QMainWindow,QApplication,QLabel,QWidget
from PyQt5.QtGui import QPixmap, QPalette
from PyQt5.QtCore import Qt
class QLabelDemo(QWidget) :
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label1 = QLabel(self)
label2 = QLabel(self)
label3 = QLabel(self)
label4 = QLabel(self)
label1.setText("<font color=yellow>这是一个文本标签.</font>")
label1.setAutoFillBackground(True)
palette = QPalette()
palette.setColor(QPalette.Window,Qt.blue) # 设置背景色
label1.setPalette(palette)
label1.setAlignment(Qt.AlignCenter)
label2.setText("<a href='#'>欢迎使用Python GUI程序</a>")
label3.setAlignment(Qt.AlignCenter)
label3.setToolTip('这是一个图片标签')
label3.setPixmap(QPixmap("./images/python.jpg"))
# 如果设为True,用浏览器打开网页,如果设为False,调用槽函数
label4.setOpenExternalLinks(True)
label4.setText("<a href='https://www.baidu.com'>百度一下</a>")
label4.setAlignment(Qt.AlignRight)
label4.setToolTip('这是一个超级链接')
vbox = QVBoxLayout()
vbox.addWidget(label1)
vbox.addWidget(label2)
vbox.addWidget(label3)
vbox.addWidget(label4)
label2.linkHovered.connect(self.linkHovered)
label4.linkActivated.connect(self.linkClicked)
self.setLayout(vbox)
self.setWindowTitle('QLabel控件演示')
def linkHovered(self):
print('当鼠标滑过label2标签时,触发事件')
def linkClicked(self):
print('当鼠标单击label4标签时,触发事件')
if __name__ == '__main__':
app = QApplication(sys.argv)
main = QLabelDemo()
main.show()
sys.exit(app.exec_())
2)QLCDNumber
QLCDNumber部件可以让数码显示与液晶数字一样的效果。在 QLCDNumber 中可以显示的数码有0/O、1、2、3、4、5/S、6、7、8、9/g、负号、A、B、C、D、E、F、h、H、L、O、P、r、u、U、Y 、冒号、度符号(输入时使用单引号来代替)和空格。
2.2 按钮部件
QAbstractButton 类是按钮部件的抽象基类,提供了按钮的通用功能。它的子类包括复选框 QCheckBox、标准按钮QPushButton、单选框按钮QRadioButton 和工具按钮 QToolButton。关于这一节,可以参考欢迎中的示例程序 Group Box Example,它在 Widgets 分类中。
(1)QPushButton
QPushButton 部件提供了 一个标准按钮。将按钮的显示文本设置为英文字母,在首字母前添加"&"符号,那么就可以将这个按钮的快捷键设置为 Alt 加上这个字母。其它更多的功能可以查看帮助文档,这里由于篇幅问题就不再介绍了。
(2)QCheckBox、QRadioButton和QGroupBox
对于调查表之类的应用,往往提供多个选项供选择。有些是可以选择多项的,有些只能选择其中一项。复选框 QCheckBox 类提供了同时选择多项的功能,而 QRadioBimon 提供了只能选择一项的功能,一般要把一组按钮放到一个QGroupBox中来进行管理。其它更多的功能可以查看帮助文档,这里由于篇幅问题就不再介绍了。
2.3 行编辑器
行编辑器QLineEdit部件是一个单行的文本编辑器,允许用户输人和编辑单行的纯文本内容,而且提供了一系列有用的功能,包括撤销与恢复、剪切和拖放等操作。其中剪切笈制等功能是行编辑自带的,不用自己编码实现。一些具体功能,可以査看Qt欢迎中的示例程序 Line Edits,它在 Widgets 分类中,这里由于篇幅问题就不再介绍了。
2.4 数值设定框
QAbstractSpinBox 类是一个抽象基类,提供了一个数值设定框和一个行编辑器来显示设定值。它有3个子类 QDateTimeEdit、QSpinBox 和 QDoubleSpinBox 分别用来完成日期时间、整数和浮点数的设定。关于这一小节,可以查看 Widgets 分类下的 Spin Boxes 示例程序,这里由于篇幅问题就不再介绍了。
2.5 滑块部件
QAbstractSlider 类提供了一个区间内的整数值,有一个滑块,可以定位到一个整数区间的任意值。这个类是一个抽象基类,有3个子类 QScrollBar、QSlider 和 QDial。 其中,滚动条 QScrollBar 更多用在 QScrollArea 类中来实现滚动区域;而 QSlider 是最常见的音量控制或多媒体播放进度等滑块;QDial是一个刻度表盘。关于这些部件,可以参考 Widgets 分类下的 Sliders 示例程序,这里由于篇幅问题就不再介绍了。