PyQt5快速开发与实战
文章目录
- PyQt5快速开发与实战
- 4. 第4章 PyQt5 基本窗口控件
- 4.2 QWidget
- 4.2.1 窗口坐标系统
- 4.2.2 常用的几何结构
- 4.2.3 创建第一个PyQt5 应用
- 4.2.4 为应用设置程序图标
- 4.2.5 显示气泡提示信息
4. 第4章 PyQt5 基本窗口控件
4.2 QWidget
基础窗口控件 QWidget类是所有用户界面对象的基类,所有的窗口和控件都直接或间接继承自QWidget类。
窗口控件(Widget,简称“控件”是在PyQt中建立界面的主要元素。在 PyQt中把没有嵌入到其他控件中的控件称为窗口,一般窗口都有边框、标题栏。窗口是指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、最大化按钮等;控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的基本元素。一个程序可以有多个窗口,一个窗口也可以有多个控件。
4.2.1 窗口坐标系统
PyQt使用统一的坐标系统来定位窗口控件的位置和大小。
- 顶层窗口:
以屏幕的左上角为原点(0,0),从左向右为x轴正向,从上向下为y轴正向,整个屏幕的坐标系统用来定位顶层窗口。 - 窗口内部:
以左上角作为原点,从左向右为x轴正向,从上向下为y轴正向,原点、x轴、y轴围成的区域叫作Client Area(客户区),在客户区周围则是标题栏(Window Title)和边框(Frame)。
QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的 geometry()提供的成员函数:x()、y())获得客户区左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的 frameGeometry()提供的成员函数: x()、y()获得窗口左上角的坐标,width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。
4.2.2 常用的几何结构
两种常用的几何结构:
- 不包含外边各种边框的几何结构
- 包含外边各种边框的几何结构
- QWidget不包含边框的常用函数
一般情况下,不包含边框的部分是客户区,这里面就是正常操作的地方,可以添加子控件。这部分是一个长方形,会有大小和位置。大小就是指宽度(width)和高度(height);位置就是指这个长方形在屏幕上的位置。在Qt中保存这个长方形使用的是QRect类,这个类也有自己的大小和位置。要改变其大小和位置,可以使用如下几个函数。
- 改变客户区的面积
QWidget.resize(width, height)
QWidget.resize(Qsize)
也可以用鼠标来改变它的大小
- 获得客户区的大小
QWidget.size()
- 获得客户区的宽度和高度
QWidget.width()
QWidget.height()
- 设置客户区的宽度和高度
QWidget.setFixedWidth(int width) # 高度固定
QWidget.setFixedHeight(int height) # 宽度固定
QWidget.setFixedSize(Qsize size)
QWidget.setFixedsize(int width, int height) # 高度宽度固定了,不可以通过鼠标来改变窗口的宽度和高度
同时改变客户区的大小和位置
QWidget.setGeometry(int x, int y, int width, int height);
QWidget.setGeometry(QRect rect)
- QWidget包含边框的常用函数
QWidget包含边框,这个边框有大小和位置,是窗口在屏幕上显示的整个区域。这里没有设置这个边框大小的函数,因为通过上面不包含边框函数的设置,就可以设置包含边框的大小了。通过下面的函数,可以获得整个窗口的位置和大小。
- 获得窗口的大小和位置
QWidget.frameGeometry()
- 设置窗口的位置
QWidget.move(int x , int y)
QWidget.move(QPoint point)
- 获得窗口左上角的坐标
QWidget.pos()
案例
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton
import sys
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
widget = QWidget()
btn = QPushButton(widget)
btn.setText("Button")
# 以QWidget左上角为(0,0)点
btn.move(20, 20)
widget.resize(300 , 200)
# 以屏幕左上角为(0,0)点
widget.move(250 , 200)
widget.setWindowTitle("PyQt 坐标系统例子")
widget.show()
print("QWidget:")
print("w.x() = %d" % widget.x())
print("w.y() = %d" % widget.y())
print("w.width() = %d" % widget.width())
print("w.height() = %d" % widget.height())
print("QWidget.geometry")
print("widget.geometry().x() = %d " % widget.geometry().x())
print("widget.geometry().y() = %d " % widget.geometry().y())
print("widget.geometry().width() = %d " % widget.geometry().width())
print("widget.geometry().height() = %d " % widget.geometry().height())
sys.exit(app.exec_())
4.2.3 创建第一个PyQt5 应用
# -*- coding:UTF-8 -*-
# 上面这行代码是为了避免在所生成的PyQt程序中出现中文乱码问题
import sys
from PyQt5.QtWidgets import QApplication,QWidget # 载入必需的模块
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv) # 每一个PyQt5程序都需要有一个QApplication对象
window = QWidget() # 所有用户界面类的父类,这里使用了没有参数的默认构造函数,没有继承其他类,称没有父类的控件为窗口。
window.resize(300 , 200) # 改变窗口控件的大小
window.move(250 , 150) # 设置窗口初始化的位置(x , y)
window.setWindowTitle("Hello PyQt5") # 设置窗口控件的标题
window.show() # 将窗口控件显示在屏幕上
sys.exit(app.exec_()) # 如果是Python3 下,完全可以写成app.exec() ,【向下兼容】
4.2.4 为应用设置程序图标
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget , QApplication
# 创建一个名为Icon的窗口类,继承自QWidget类
class Icon(QWidget):
def __init__(self,parent = None):
super(Icon, self).__init__(parent) # 必须调用两个构造函数
self.initUI()
# 初始化窗口
def initUI(self):
self.setGeometry( 300 , 300 ,250 , 150)
self.setWindowTitle("程序图标")
self.setWindowIcon(QIcon('../打包资源文件/pic/cartoon2.ico'))
if __name__ == '__main__':
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
icon = Icon()
icon.show()
sys.exit(app.exec_())
Python同时支持面向过程和面向对象编程,PyQt的精髓是面向对象编程。
4.2.5 显示气泡提示信息
import sys
from PyQt5.QtWidgets import QWidget , QToolTip , QApplication
from PyQt5.QtGui import QFont
class Winform(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif',10))
self.setToolTip('这是一个<b>气泡提示</b>')
self.setGeometry(200 , 300 ,400 ,400)
self.setWindowTitle("气泡提示demo")
if __name__ == '__main__':
from pyqt5_plugins.examples.exampleqmlitem import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QApplication(sys.argv)
win = Winform()
win.show()
sys.exit(app.exec_())
当鼠标悬停于主窗口中时,显示气泡提示。