GUI编程--PyQt5--QWidget2
创始人
2024-01-28 10:18:12

文章目录

  • 事件
  • 事件传递
  • 父子关系扩展
  • Z轴的层级关系

事件

自定义控件类(QWidget),然后重写对应的事件方法即可。
控件显示时触发,showEvent(QShowEvent)
控件关闭时触发,closeEvent(QCloseEvent)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

事件传递

在这里插入图片描述

案例:
通过事件监听,如果按下A键 则打印“按下了A”
如果按下了Ctrl + S, 则打印 “Ctrl + S被按下”
如果按下了Ctrl + Shift + S,则打印“Ctrl + Shift + S按下”

普通按键 event.key() == Qt.Key_A/Tab…
修饰键 event.modifiers()
在这里插入图片描述
代码:

# __author__ = "laufing"from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QDesktopWidget
import sysclass Window(QWidget):def __init__(self):super(Window, self).__init__()# 窗口标题self.setWindowTitle("laufing")# 窗口图标pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)icon = QIcon()icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)self.setWindowIcon(icon)# 设置宽高self.resize(500, 600)# 窗口居中desktop_geo = QDesktopWidget().geometry()width, height = desktop_geo.width(), desktop_geo.height()self.move(width/2-self.width()/2, height/2 - self.height()/2)# 设置文本self.label = MyLabel(self)self.label.setText("测试按钮被按下")self.label.resize(200, 200)self.label.move(100, 100)# 文本获取键盘焦点self.label.grabKeyboard()# self.label.grabMouse()class MyLabel(QLabel):# 重写事件函数def keyPressEvent(self, evt: QKeyEvent):print("键盘按下...")# 判断按下的键if evt.key() == Qt.Key.Key_A:print("A 被按下")# 加修饰按键 的 组合 Ctrl + Selif evt.modifiers() == Qt.KeyboardModifier.ControlModifier and evt.key() == Qt.Key.Key_S:print("Ctrl + S 被按下")# 多个修饰键elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier \and evt.key() == Qt.Key.Key_S:print("Ctrl + Shift + S 被按下")else:print("其他按钮...")if __name__ == '__main__':# 窗口应用程序app = QApplication(sys.argv)window = Window()window.show()status_code = app.exec_()sys.exit(status_code)

案例2:在用户区域,按下鼠标左键,可以拖动窗口,按右键就不可以拖动

# __author__ = "laufing"from PyQt5.QtGui import QIcon, QPixmap, QCursor, QKeyEvent
from PyQt5 import QtGui
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QWidget, QApplication, QLabel, QDesktopWidget
import sysclass Window(QWidget):def __init__(self):super(Window, self).__init__()# 窗口标题self.setWindowTitle("laufing")# 窗口图标pixmap = QPixmap("./imgs/dog.jpg").scaled(50, 50)icon = QIcon()icon.addPixmap(pixmap, QIcon.Normal, QIcon.Off)self.setWindowIcon(icon)# 设置宽高self.resize(500, 600)# 窗口居中desktop_geo = QDesktopWidget().geometry()width, height = desktop_geo.width(), desktop_geo.height()self.move(width/2-self.width()/2, height/2 - self.height()/2)# 设置文本self.label = MyLabel(self)self.label.setText("测试按钮被按下")self.label.resize(200, 200)self.label.move(100, 100)# 文本获取键盘焦点self.label.grabKeyboard()# self.label.grabMouse()# 移动标记self.move_flag = None# ***************************************# 完成鼠标点击(左键)用户区域,实现窗口的拖拽# 按下左键后,实现窗口左顶点  与 鼠标的顶点 同步def mousePressEvent(self, event: QtGui.QMouseEvent):# 按下的是否左键if event.button() == Qt.MouseButton.LeftButton:self.move_flag = True# 窗口左顶点 初始位置self.window_origin_x = self.x()self.window_origin_y = self.y()print("窗口初始位置:", self.window_origin_x, self.window_origin_y)# 鼠标顶点初始位置self.mouse_x = event.globalX()self.mouse_y = event.globalY()print("鼠标初始位置:", self.mouse_x, self.mouse_y)def mouseMoveEvent(self, event: QtGui.QMouseEvent):if self.move_flag:# 获取鼠标移动后的偏移量offset_x = event.globalX() - self.mouse_xoffset_y = event.globalY() - self.mouse_yprint("偏移量:", offset_x, offset_y)# 窗口移动 偏移量self.dest_x = self.window_origin_x + offset_xself.dest_y = self.window_origin_y + offset_y# 移动窗口self.move(self.dest_x, self.dest_y)def mouseReleaseEvent(self, event: QtGui.QMouseEvent):self.move_flag = False# ***************************************class MyLabel(QLabel):# 重写事件函数def keyPressEvent(self, evt: QKeyEvent):print("键盘按下...")# 判断按下的键if evt.key() == Qt.Key.Key_A:print("A 被按下")# 加修饰按键 的 组合 Ctrl + Selif evt.modifiers() == Qt.KeyboardModifier.ControlModifier and evt.key() == Qt.Key.Key_S:print("Ctrl + S 被按下")# 多个修饰键elif evt.modifiers() == Qt.KeyboardModifier.ControlModifier | Qt.KeyboardModifier.ShiftModifier \and evt.key() == Qt.Key.Key_S:print("Ctrl + Shift + S 被按下")else:print("其他按钮...")if __name__ == '__main__':# 窗口应用程序app = QApplication(sys.argv)window = Window()window.show()status_code = app.exec_()sys.exit(status_code)

父子关系扩展

parent.childAt(x, y)
child.parentWidget()
parent.childrenRect() 父控件下所有的子控件组成的矩形区域
在这里插入图片描述
案例:
在一个窗口里设置多个QLabel子控件,点击某个QLabel 则为选中(cyan背景),再次点击则取消(white背景)。

# 重写QLabel的点击事件
class MyLabel(QLabel):def __init__(self, *args, **kwargs):super(MyLabel, self).__init__(*args, **kwargs)self.flag = True# QLabel的点击事件def mousePressEvent(self, event: QtGui.QMouseEvent):if self.flag:self.setStyleSheet("background-color: cyan")self.flag = Falseelse:self.setStyleSheet("background-color: white")self.flag = True

另外也可以重写父控件的点击事件(mousePressEvent)。

Z轴的层级关系

在这里插入图片描述
案例: 点击某个子控件,实现该子控件移动到最上层

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
不用电脑怎么设置苹果铃声 ip... 需要一个app,加上苹果自带的app即可1、手机下载爱思极速版。因为之前换手机搬移数据时店员帮忙整理...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
才高八斗的主人公 三顾茅庐的主... 古代君王在建立自己的政治体系之时,大多会采取一些礼贤下士的手段,对于一些有卓越才能的人放低姿态。因为...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...