基础窗口控件QWidget类是所有用户界面对象的基类,所有的窗口和控件都是直接或间接继承自QWidget类。
窗口控件(Widget,简称“控件”)是在PyQt中建立界面的主要元素。在PyQt中把没有嵌入到其他控件中的控件称为窗口,一般窗口都有边框、标题栏。窗口是指程序的整体界面,可以包含标题栏、菜单栏、工具栏、关闭按钮、最小化按钮、最大化按钮等;控件是指按钮、复选框、文本框、表格、进度条等这些组成程序的基本元素。一个程序可以有多个窗口,一个窗口也可以有多个控件。
1. 窗口坐标系统
PyQt使用统一的坐标系统来定位窗口控件的位置和大小。具体的坐标系统如下图所示。
以屏幕左上角为原点,即(0, 0)点,从左向右为x轴正向,从上向下为y轴正向,整个屏幕的坐标系统就用来定位定位顶层窗口的。
此外,在窗口内部也有自己的坐标系统,该坐标系统仍然以左上角为原点,从左向右为x轴正向,从上向下为y轴正向,原点、x轴、y轴围成的区域叫作Client Area(客户区),在客户区的周围则是标题栏(Window Title)和边框(Frame)。
下图所示是Qt提供的分析QWidget几何结构的一张图。
从上图可以看出,成员函数分为三类。
QWidget直接提供的成员函数:x()、y()获得窗口左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的geometry()提供的成员函数:x()、y()获得客户区左上角的坐标,width()、height()获得客户区的宽度和高度。
QWidget的frameGeometry()提供的成员函数:x()、y()获得客户区左上角的坐标,width()、height()获得包含客户区、标题栏和边框在内的整个窗口的宽度和高度。
2. 常用的几何机构
QWidget不包含边框的常用函数
1)改变客户区的面积
QWidget.resize(width, height)
QWidget.resize(QSize)
2)获得客户区的大小
QWidget.size()
3)获得客户区的宽度和高度
QWidget.width()
QWidget.height()
4)设置客户区的宽度和高度
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)
x 和 y 对应的就是 x 和 y 坐标。可以不单独设置x 和 y 坐标。
QWidget包含边框的常用函数
1)获得窗口的大小和位置
QWidget.frameGeometry()
2)设置窗口的位置
QWidget.move(int x, int y)
QWidget.move(QPoint point)
3)获得窗口左上角的坐标
QWidget.pos()
案例4 屏幕坐标系统显示
import sys from PyQt5.QtWidgets import QApplication, QWidget, QPushButton app = QApplication(sys.argv) widget = QWidget() btn = QPushButton(widget) btn.setText("Button") btn.move(20, 20) widget.resize(300, 200) 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("w.geometry().x() = %d" % widget.geometry().x()) print("w.geometry().y() = %d" % widget.geometry().y()) print("w.geometry().width() = %d" % widget.geometry().width()) print("w.geometry().height() = %d" % widget.geometry().height()) sys.exit(app.exec_())
3. 创建第一个PyQt5应用
案例5 建立一个主窗口
import sys from PyQt5.QtWidgets import QApplication, QWidget app = QApplication(sys.argv) window = QWidget() window.resize(300, 200) window.move(250, 150) window.setWindowTitle("Hello PyQt5") window.show() sys.exit(app.exec_())
4. 为应用设置程序图标
案例6 设置程序图标
import sys from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QWidget, QApplication # 创建一个名为Icon的窗口类,继承自QWidget类 class Icon(QWidget): def __init__(self, parent=None): super().__init__(parent) self.initUI() # 初始化窗口 def initUI(self): self.setGeometry(300, 300, 250, 150) self.setWindowTitle("程序图标") self.setWindowIcon(QIcon("./cartool1.ico")) if __name__ == "__main__": app = QApplication(sys.argv) icon = Icon() icon.show() sys.exit(app.exec_())
5. 显示气泡提示信息
案例7 显示提示信息
import sys from PyQt5.QtGui import QFont from PyQt5.QtWidgets import QWidget, QApplication, QToolTip 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__": app = QApplication(sys.argv) win = WinForm() win.show() sys.exit(app.exec_())