.net建网站的优势/脚本外链平台
文章目录
- QWidget简介
- 功能作用
- 控件的创建
- 坐标系统
- 控件位置与大小
- 调整位置与尺寸
- 最大、最小尺寸
- 控件内容外边距
- 设置鼠标的形状
- 鼠标跟踪
QWidget简介
- 控件是用户界面的最小元素,是一个矩形局域。
- 没有父控件的控件为顶级控件,会装饰一个标题栏,成为一个窗口。父控件调用show()后,会注意遍历其下的子控件并展示。
- 子控件,会被父控件管理、裁剪。
- QWidget是所有可视化控件的基类,是一个空白控件,继承自QObject
- 所有控件按照Z轴排序
obj._bases_, 获取直接父类,是一个属性
obj.mro() 获取继承链的父类
obj._subclasses_() 获取子类, 是一个魔法方法
功能作用
控件的创建
from PyQt5.QtWidgets import QLabellabel = QLabel(parent, flags)# parent 父控件
# 标志位 设置窗口的外观
坐标系统
窗口的左上角或者父控件的左上角为原点
控件位置与大小
obj.x(), 距离父控件或者屏幕左上角的x轴距离,包含边框
obj.y(),距离父控件或者屏幕左上角的y轴距离,包含边框
obj.pos(), x和y的组合,是QPoint(x,y) 的对象
obj.width() 控件的宽度,不含边框
obj.height() 控件的高度,不含边框
obj.size() 宽高的组合,QSize(width, height) 的对象
geometry, 用户区域(纯控件部分)相对于父控件或者屏幕的位置,是QRect(x,y, width, height) 的对象
调整位置与尺寸
控件显示后,再设置位置和尺寸????
# 根据内容,自适应大小
label.adjustSize()
# 设置固定大小, 无法变化
label.setFixedSize(300, 400)
布局案例:
- 创建一个窗口,width 500, height 500, 左边框距离300, 上边框距离300
- 让用户输入显示的子控件总数量,每一行显示的子控件数,实现九宫格展示所有的子控件
代码:
# __author__ = "laufing"# 导包
# from PyQt5.Qt import * 导入所有的类, 占用内存
from PyQt5.QtWidgets import QApplication # 应用控件
from PyQt5.QtWidgets import QLabel
from PyQt5.QtWidgets import QWidget
from PyQt5.QtGui import QIcon
from PyQt5.QtGui import QPixmap
import sysif __name__ == '__main__':total_widget = int(input("输入总数:").strip())row_count = int(input("每行展示数:").strip())# 多少行row_ = total_widget/row_count if total_widget % row_count == 0 else total_widget // row_count + 1sub_col_width = 500 / row_countsub_row_height = 500 / row_# 1.创建应用程序app = QApplication(sys.argv)print("接收的命令行参数:", app.arguments())# print("全局的应用程序对象:", qApp)# 2. 控件操作window = QWidget() # 窗口控件window.setWindowTitle("laufing") # 窗口标题window.resize(500, 500) # 调整窗口大小(用户区域)window.move(300, 300) # 移动窗口位置(包含边框)# 创建控件对象,并放入 窗口控件# i控制行,j 控制列i,j = 0, 0#print("xxx total widget:", total_widget)for k in range(total_widget):print("xxxxx:", k)label = QLabel(window) # 实例化一个标题控件,放入window窗口控件中label.setText("文本" + "%s, %s, %s"%(i, j, k))if j % 2 == 0:label.setStyleSheet("background-color: cyan; text-align: center;")else:label.setStyleSheet("background-color: pink")label.resize(sub_col_width, sub_row_height)label.move(j*sub_col_width, i*sub_row_height)j += 1if j == row_count:i += 1j = 0# logo 图标icon = QIcon()icon.addPixmap(QPixmap("./imgs/dog.jpg"), QIcon.Normal, QIcon.Off) # 添加Pixmap对象window.setWindowIcon(icon)# 显示window.show()# 3. app.exec_() 进入消息循环,保证程序一直运行exit_code = app.exec_()# 退出程序,并传入退出码sys.exit(exit_code)
最大、最小尺寸
设置了最大尺寸后,手动和代码都无法逾越最大尺寸
控件内容外边距
obj.setContentsMargin(左,上,右,下)
obj.getContentsMargin()
obj.contentsRect() 内容区域
实现如下效果:
设置鼠标的形状
鼠标移动到某控件(区域)时,显示的形状。
obj.setCursor(Qt.xxx)
# 设置鼠标的样式
from PyQt5.QtCore import Qt
window.setCursor(Qt.CursorShape.CrossCursor)
自定义鼠标样式:
from PyQt5.QtGui import QIcon, QPixmap, QCursor
# 自定义鼠标的样式
pix_map = QPixmap("./imgs/dog.jpg")
# 缩放图片
pix_map2 = pix_map.scaled(30, 30) # 30 * 30
# 实例化QCursor 对象
q_cursor = QCursor(pix_map2) # 后面两个参数 hotX,hotY 鼠标的箭头点
# 控件对象 设置鼠标样式
window.setCursor(q_cursor)# 取消设置
window.unsetCursor()# 控件获取鼠标对象
current_cursor = window.cursor() # QCursor对象# 设置鼠标的位置
current_cursor.setPos(0, 0)
# 打印鼠标的位置
print(current_cursor.pos())current_cursor.pixmap() # 获取鼠标图片
鼠标跟踪
自定义控件类,并重写mouseMoveEvent
class MyWindow(QWidget):# 鼠标移动事件def mouseMoveEvent(self, mouseEvent: QMouseEvent):print("全局位置(屏幕位置)...", mouseEvent.globalPos())print("局部位置(窗口位置)...", mouseEvent.localPos())print("屏幕位置(全局位置)...", mouseEvent.screenPos())print("窗口位置(布局位置)...", mouseEvent.windowPos())print("button...", mouseEvent.button())print("buttons...", mouseEvent.buttons())
这里设置鼠标移动的跟踪,则鼠标移动就触发上述事件
# 控件内部设置鼠标跟踪,触发mouseMoveEvent
window.setMouseTracking(True)
window.setMouseTracking(False)
案例: 创建一个窗口,内部实现一个QLabel控件,当鼠标移入窗口后,让QLabel控件随着鼠标的位置而移动位置
# __author__ = "laufing"from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget, QLabel
from PyQt5 import QtGuiclass MyWindow(QWidget):def __init__(self):super().__init__()self.setWindowTitle("laufing")# 实例化图片对象pixmap = QtGui.QPixmap("./imgs/dog.jpg").scaled(50, 50)# 实例化图标对象icon = QtGui.QIcon()icon.addPixmap(pixmap, QtGui.QIcon.Normal, QtGui.QIcon.Off)self.setWindowIcon(icon)# 设置窗口内容宽高self.resize(500, 500)# 窗口居中desktop_geo = QDesktopWidget().geometry()screen_width, screen_height = desktop_geo.width(), desktop_geo.height()self.move(screen_width/2 - self.width()/2, screen_height/2 - self.height()/2)# 设置鼠标 追踪self.setMouseTracking(True)# 设置QLabel控件对象self.label = QLabel(self)self.label.setText("测试鼠标追踪")self.label.setStyleSheet("background-color: pink;")self.label.resize(100, 50)self.label.move(10, 10)def mouseMoveEvent(self, a0: QtGui.QMouseEvent):print("鼠标移动.....")x,y = a0.localPos().x(), a0.localPos().y()self.label.move(x, y)if __name__ == '__main__':import sysapp = QApplication(sys.argv)window = MyWindow()window.show()exit_code = app.exec_()sys.exit(exit_code)