【PyQt学习篇 · ⑨】:QWidget -控件交互

文章目录

  • 是否可用
  • 是否显示/隐藏
  • 是否编辑
  • 是否为活跃窗口
  • 关闭
  • 综合案例
  • 信息提示
    • 状态提示
    • 工具提示
    • “这是什么”提示
  • 焦点控制
    • 单个控件角度
    • 父控件角度

是否可用

  1. setEnabled(bool):该函数用于设置QWidget控件的可用性,参数bool为True表示该控件为可用状态,False表示该控件为不可用状态。当控件处于不可用状态时,该控件将无法响应用户的交互事件。

  2. isEnabled():该函数用于获取QWidget控件的当前可用状态,返回值为一个bool类型,True表示该控件为可用状态,False 表示该控件为不可用状态。

以下为代码示例:

from PyQt5.QtWidgets import *
import sysapp = QApplication(sys.argv)window = QWidget()
window.resize(300, 300)
btn = QPushButton(window)
btn.setText('按钮')# 设置按钮为不可用
btn.setEnabled(False)
print(btn.isEnabled())  # 获取当前按钮是否可用的状态,并打印出来window.show()sys.exit(app.exec_())

运行结果:
观察一下打印结果,按钮设置为不可用之后会颜色会变暗,且不能被点击。

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

是否显示/隐藏

  1. setVisible(bool)(或setHidden(bool)):这个函数用于设置QWidget控件的可见状态。当参数bool为True时,控件将会显示出来;当参数bool为False时,控件将会隐藏起来。

  2. show():这个函数将会显示QWidget控件。相当于调用setVisible(True)

  3. hide():这个函数将会隐藏QWidget控件。相当于调用setVisible(False)

  4. isHidden():这个函数返回一个bool值,表示当前QWidget控件是否处于隐藏状态。如果返回值为True,表示控件被隐藏;如果返回值为False,表示控件可见。

  5. isVisible():这个函数返回一个bool值,表示当前QWidget控件是否处于可见状态。如果返回值为True,表示控件可见;如果返回值为False,表示控件隐藏。

  6. isVisibleTo(widget):这个函数用于检查QWidget控件是否对另一个特定的widget可见。(父控件显示的时候,子控件是否会跟着显示)它接受一个widget作为参数,返回一个bool值表示控件是否对该widget可见。

注意:

  • visibel:代表控件最终的状态,是否被我们所减(被其他控件遮挡也属于可见)
  • hide:可理解为相对于父控件是否可见

以下为代码示例:

from PyQt5.QtWidgets import *
import sysclass Window(QWidget):# 重写绘制事件def paintEvent(self, QPaintEvent):print('窗口被绘制')return super().paintEvent(QPaintEvent)class Btu(QPushButton):# 重写绘制事件def paintEvent(self, QPaintEvent):print('按钮被绘制')return super().paintEvent(QPaintEvent)if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.resize(300, 300)btu = Btu(window)btu.setText('按钮')btu.setVisible(False)# 打印父控件如果显示的时候,子控件是否跟着被显示print(btu.isVisibleTo(window))window.show()sys.exit(app.exec_())

运行结果:
可以看到按钮已经被隐藏

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

是否编辑

设置窗口标题xxx[*]

  1. setWindowModified(bool):这个函数用于设置QWidget控件的编辑状态。当参数bool为True时,控件将会被视为已编辑;当参数bool为False时,控件将不再被视为已编辑。

  2. isWindowModified():这个函数返回一个bool值,表示当前QWidget控件是否处于编辑状态。如果返回值为True,表示控件已经被编辑过;如果返回值为False,表示控件未被编辑。

代码示例:

from PyQt5.QtWidgets import *
import sysapp = QApplication(sys.argv)window = QWidget()
window.setWindowTitle('[*]交互状态')
window.resize(300, 300)window.setWindowModified(True)  # 设置窗口可编辑状态
print(window.isWindowModified())window.show()
sys.exit(app.exec_())

运行结果:

在这里插入图片描述

是否为活跃窗口

活跃窗口是用户当前正在与之交互的窗口,例如正在编辑文本、接收键盘输入或执行操作。

isActiveWindow(): 这个函数用于检查QWidget控件是否为活跃窗口。如果控件是当前应用程序激活的窗口,即接收键盘和鼠标事件的窗口,则函数返回True;否则返回False。

代码示例:

from PyQt5.QtWidgets import *
import sysapp = QApplication(sys.argv)w1 = QWidget()
w1.resize(300, 300)
w1.setWindowTitle('w1')w2 = QWidget()
w2.resize(400, 200)
w2.setWindowTitle('w2')w1.show()
w2.show()w1.raise_()     # 将w1窗口设为顶层窗口print(w1.isActiveWindow())      # 打印w1是否为活跃窗口
print(w2.isActiveWindow())      # 打印w2是否为活跃窗口sys.exit(app.exec_())

运行结果:
从下图中我们看到,即使使用了raise_()将w1窗口设置为顶层窗口,但是w1却不是活跃窗口(标题栏为灰色)。

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

关闭

  1. close():这个函数用于关闭QWidget控件,使其不可见。调用该函数时会触发 closeEvent() 函数,您可以在该函数中执行额外的操作,例如先隐藏控件,等待异步操作完成后再关闭。

  2. setAttribute(Qt.WA_DeleteOnClose, True):这个函数就是告诉 PyQt 在控件关闭后将其删除。由于控件在关闭时不会自动删除,因此需要在退出函数closeEvent()中调用 deleteLater() 函数或手动删除控件。

代码示例:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sysapp = QApplication(sys.argv)window = QWidget()
window.resize(300, 300)btn = QPushButton(window)
btn.setText('按钮')btn.destroyed.connect(lambda: print('按钮被销毁'))   # 绑定销毁事件,若按钮被销毁则打印“按钮被销毁”#### 测试代码区 ######## 测试代码区 ####window.show()
sys.exit(app.exec_())

下面将再测试代码区中编写测试API的代码:

btn.close()
print(btn.isHidden())

运行结果:
按钮已被隐藏,控制台输出True,按钮被隐藏而没有被释放。

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

btn.setAttribute(Qt.WA_DeleteOnClose, True)
btn.close()

运行结果:

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

综合案例

案例:创建一个窗口,包含一个文本框和一个按钮以及一个标签。

要求:

  • 默认状态:标签隐藏;文本框和按钮显示;按钮设置为不可用状态。
  • 当文本框有内容时,标签显示登录,让按钮可用,否则不可用。
  • 当文本框内容为PyQt5时,点击按钮则显示标签,并展示文本为登录成功,否则为失败。

涉及知识点:

  • 文本框的创建:QLineEdit
  • 文本框监测内容变更:textChanged信号
  • 文本框内容的获取:text()方法
  • 按钮状态的设置

综合案例的代码:

from PyQt5.QtWidgets import *
import sysclass Window(QWidget):def __init__(self, parent=None):super().__init__(parent)self.setWindowTitle("综合案例")self.resize(300, 300)self.setup_ui()def setup_ui(self):self.label = QLabel(self)self.label.setStyleSheet('background-color: cyan;')self.label.move(100, 50)self.label.hide()self.lineEdit = QLineEdit(self)self.lineEdit.move(100, 100)self.lineEdit.textChanged.connect(self._textChanged)    # 文本框文本改变事件绑定self.btu = QPushButton(self)self.btu.setText('按钮')self.btu.move(100, 150)self.btu.setEnabled(False)self.btu.pressed.connect(self._btuPressed)def _textChanged(self):self.label.show()self.label.setText('登录')self.label.adjustSize()if len(self.lineEdit.text()) > 0:self.btu.setEnabled(True)else:self.label.hide()def _btuPressed(self):self.label.show()if self.lineEdit.text() == 'PyQt5':self.label.setText('登录成功')else:self.label.setText('登录失败')self.label.adjustSize()     # 将标签设置为自适应if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

运行结果:

在这里插入图片描述

信息提示

状态提示

  1. statusTip()函数:

    • 它用于获取控件的状态提示信息,返回一个字符串。
    • 示例:tooltip = button.statusTip()
  2. setStatusTip(str)函数:

    • 它用于设置控件的状态栏提示信息。
    • 示例:button.setStatusTip('Press this button to do something cool!')

示例代码:

from PyQt5.QtWidgets import *
import sysapp = QApplication(sys.argv)window = QMainWindow()      # 懒加载,用到的时候才会创建
window.setWindowTitle('信息案例')
window.resize(300, 300)window.statusBar()  # 设置状态栏
window.setStatusTip('这是一个窗口')   # 设置状态栏提示信息window.show()sys.exit(app.exec_())

运行结果:

在这里插入图片描述
在以上代码中使用QMainWindow()是因为它是PyQt中提供的一个主窗口类,适用于创建带有菜单栏、工具栏、状态栏和中央部件的应用程序窗口。

工具提示

  1. toolTip() 函数:

    • 它用于获取控件的工具提示信息,返回一个字符串。
    • 示例:tooltip = button.toolTip()
  2. setToolTip(str) 函数:

    • 它用于设置控件的工具提示信息。
    • 示例:button.setToolTip('This is a button')

工具提示持续时间:

  • 工具提示可以设置它们在屏幕上显示的持续时间。
  • 默认情况下,工具提示将持续一段时间后自动消失。
  1. toolTipDuration() 函数:

    • 它用于获取工具提示的持续时间,以毫秒为单位。
    • 示例:duration = QToolTip.toolTipDuration()
  2. setToolTipDuration(msec) 函数:

    • 它用于设置工具提示的持续时间,以毫秒为单位。
    • 示例:QToolTip.setToolTipDuration(5000)

示例代码:

from PyQt5.QtWidgets import *
import sysapp = QApplication(sys.argv)window = QMainWindow()
window.setWindowTitle('信息案例')
window.resize(300, 300)label = QLabel(window)
label.setText('标签')label.setToolTip('这是一个标签')  # 设置标签工具提示信息
print(label.toolTip())  # 打印工具提示信息label.setToolTipDuration(2000)  # 设置标签工具提示信息为2秒
print(label.toolTipDuration())  # 打印工具提示信息的时间window.show()
sys.exit(app.exec_())

运行结果:

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

“这是什么”提示

  1. whatsThis() 函数:

    • 它用于获取控件的“这是什么”提示信息,返回一个字符串。
    • 示例:wts = button.whatsThis()
  2. setWhatsThis(str) 函数:

    • 它用于设置控件的“这是什么”提示信息。
    • 示例:button.setWhatsThis('This is a button')

示例代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sysapp = QApplication(sys.argv)window = QMainWindow()
window.setWindowTitle('信息案例')
window.resize(300, 300)window.setWindowFlags(Qt.WindowContextHelpButtonHint)label = QLabel(window)
label.setText('标签')
label.adjustSize()label.setWhatsThis('这是什么标签')
print(label.whatsThis())    # 打印“这是什么”提示信息window.show()
sys.exit(app.exec_())

运行结果:
点击窗口标题栏中的“?”,将鼠标移动到标签并点击,点击后即出现“这是什么”提示信息。

在这里插入图片描述
以上代码中使用了 window.setWindowFlags(Qt.WindowContextHelpButtonHint) 这行代码来设置窗口标志,其作用是在窗口的标题栏右侧添加一个帮助按钮,也就是包含一个问号图标并显示"What’s This"文本的帮助按钮,用于提供更多的上下文相关帮助信息。

焦点控制

在 PyQt 中,焦点控制是指应用程序中各个控件接收焦点的方式和顺序。焦点控制允许用户使用键盘或鼠标与特定控件进行交互。下面是一些在 PyQt 中实现焦点控制的方法和技术。

单个控件角度

  1. setFocus() 函数:

    • 它用于将焦点设置到特定控件上,使该控件成为接收键盘输入的目标。
    • 示例:widget.setFocus()
  2. setFocusPolicy(Policy) 函数:

    • 它用于设置控件的焦点策略,即定义用户如何通过键盘或鼠标与控件交互。
    • 可选的焦点策略包括:
      • Qt.TabFocus:通过 Tab 键进行切换焦点。
      • Qt.ClickFocus:通过点击鼠标进行设置焦点。
      • Qt.StrongFocus:允许通过 Tab 键和点击鼠标进行焦点设置。
      • Qt.NoFocus:控件不接收焦点。
    • 示例:widget.setFocusPolicy(Qt.TabFocus)
  3. clearFocus() 函数:

    • 它用于清除控件上的焦点,使控件不再处于焦点状态。
    • 示例:widget.clearFocus()

示例代码:

from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt
import sysapp = QApplication(sys.argv)window = QWidget()
window.setWindowTitle('焦点控制')
window.resize(300, 300)le1 = QLineEdit(window)
le1.move(50, 50)le2 = QLineEdit(window)
le2.move(50, 100)le3 = QLineEdit(window)
le3.move(50, 150)window.show()
sys.exit(app.exec_())

运行结果:
以上代码没有设置获取焦点的策略,默认情况下运行程序,第一个文本框会获得焦点,且按下Tab键可切换焦点。

在这里插入图片描述

在以上代码的基础上设置le2获取焦点的策略为通过Tab键获取焦点:

le2.setFocusPolicy(Qt.TabFocus)

运行结果:
鼠标点击le2并不能获取到焦点,而点击le3可获取到焦点,只有通过Tab键才能让le2获取焦点。

在这里插入图片描述

父控件角度

  1. focusWidget() 函数:

    • 使用此函数可以查找当前具有焦点的子控件。
    • 示例:parent.focusWidget()
  2. focusNextChild() 函数:

    • 使用此函数可以将焦点从当前具有焦点的子控件移动到下一个子控件。
    • 示例:parent.focusNextChild()
  3. focusPreviousChild() 函数:

    • 使用此函数可以将焦点从当前具有焦点的子控件移动到上一个子控件。
    • 示例:parent.focusPreviousChild()
  4. focusNextPrevChild(bool) 函数:

    • 使用此函数可以根据当前具有焦点的子控件,将焦点移动到下一个或上一个子控件。
    • 当参数为 true 时,向下查找下一个子控件;当参数为 false 时,向上查找上一个子控件。
    • 示例:parent.focusNextPrevChild(True)
  5. setTabOrder(pre_widget, next_widget) 函数:

    • 使用此函数可以设置两个控件之间的 Tab 键顺序,按下 Tab 键时焦点会从第一个控件切换到第二个控件。
    • 示例:QWidget.setTabOrder(widget1, widget2)

示例1代码

from PyQt5.QtWidgets import *
import sysclass Window(QWidget):def mousePressEvent(self, QPressEvent):print('获取焦点的控件:', self.focusWidget())if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.resize(300, 300)le1 = QLineEdit(window)le1.move(50, 0)print('le1对象:', le1)le2 = QLineEdit(window)le2.move(50, 50)le3 = QLineEdit(window)le3.move(50, 100)window.show()# 获取当前窗口内部,所有子控件当中获取焦点的那个控件print(window.focusWidget())sys.exit(app.exec_())

运行结果:

在这里插入图片描述
在这里插入图片描述
窗口显示时,焦点为None的原因:初始焦点未明确设置时,窗口显示时焦点会默认为None,也就是执行到window.show()的时候所有子控件都没有获取到焦点,而往后继续执行的过程中,第一个子控件才获取到焦点。

示例2代码:

from PyQt5.QtWidgets import *
import syapp = QApplication(sys.argv)window = QWidget()
window.resize(300, 300)le1 = QLineEdit(window)
le1.move(50, 0)le2 = QLineEdit(window)
le2.move(50, 50)le3 = QLineEdit(window)
le3.move(50, 100)# 设置获取焦点规则
window.setTabOrder(le1, le3)
window.setTabOrder(le3, le2)window.show()sys.exit(app.exec_())

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/129490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqli 靶场 Level23-Level30 wp

level-23 (注释被过滤) 抓包,查看正常请求和响应。 略 尝试是否存在注入 id1’,id1’,成周期性变化 尝试 POC POC: id1andextractValue(1,concat(0x7e,user()))-- 结果:failed。怀疑–被过滤掉了,尝试…

创建javaEE项目(无maven),JSP(九大内置对象)、Servlet(生命周期)了解

一、Servlet和jsp 0.创建web项目(无maven): 1.创建一个普通的java项目 2.项目根目录右键,添加模板 3.配置tomcat服务器 4.配置项目tomcat依赖 1.Servlet(Server Applet)服务端小程序 用户通过浏览器发送一个请求,服务器tomcat接收到后&…

基于nodejs+vue 网上商城系统系统-毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

乌班图 Linux 系统 Ubuntu 23.10.1 发布更新镜像

Ubuntu 团队在其官网上发布了Ubuntu 23.10.1 版本,这是目前较新的 Ubuntu 23.10(Focal Fossa)操作系统系列的第一个发行版,旨在为社区提供最新的安装媒体。Ubuntu 22.04 LTS(Focal Fossa)操作系统系列于 2022 年 4 月 21 日发布。 Ubuntu 23.10 LTS(长期支持版本)可用…

Win10/Win11总是自动更新,如何关闭自动更新?

参考:https://www.zhihu.com/search?q%E5%85%B3%E9%97%ADwindows%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0&search_sourceSuggestion&utm_contentsearch_suggestion&typecontent 手动关闭 1 Windows服务 1.1 WinR输入services.msc打开服务 1.2 找到Windows Update…

hugetlb核心组件

1 概述 hugetlb机制是一种使用大页的方法,与THP(transparent huge page)是两种完全不同的机制,它需要: 管理员通过系统接口reserve一定量的大页,用户通过hugetlbfs申请使用大页, 核心组件如下图: 围绕着…

日本it培训学费 想去日本做IT,需要具备哪些技术?

日本的IT行业历史比较悠久,业务以上层前端业务为主,如设计和构建软件。日本IT公司组织庞大,行业内部有着严格的分工和部署,工作会被细分化,分配给个人的工作量不会太大,难度也不会很高,所以日本…

设计模式之装饰模式--优雅的增强

目录 概述什么是装饰模式为什么使用装饰模式关键角色基本代码应用场景 版本迭代版本一版本二版本三—装饰模式 装饰模式中的巧妙之处1、被装饰对象和装饰对象共享相同的接口或父类2、当调用装饰器类的装饰方法时,会先调用被装饰对象的同名方法3、子类方法与父类方法…

【TS篇一】TypeScript介绍、使用场景、环境搭建、类和接口

文章目录 一、TypeScript 介绍1. TypeScript 是什么1.2 静态类型和动态类型1.3 Why TypeScript1.4 TypeScript 使用场景1.5 TypeScript 不仅仅用于开发 Angular 应用1.6 前置知识 二、如何学习 TypeScript2.1 相关链接 三、起步3.1 搭建 TypeScript 开发环境3.2 编辑器的选择3.…

音频修复增强软件iZotope RX 10 mac中文特点

iZotope RX 10 mac是一款音频修复和增强软件。 iZotope RX 10 mac主要特点 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。 音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等处…

[概述] 点云滤波器

拓扑结构 点云是一种三维数据,有几种方法可以描述其空间结构,以利于展开搜索 https://blog.csdn.net/weixin_45824067/article/details/131317939 KD树 头文件:pcl/kdtree/kdtree_flann.h 函数:pcl::KdTreeFLANN 作用&#xff1a…

一个 不用氪金 也能让你变强的 VSCode 插件 Ai

哈喽,大家好 我是 彩色之外👨🏻‍💻。今天给大家推荐一款不用充钱也能让你变强的 vscode 插件 通义灵码(TONGYI Lingma),可以称之为 Copilot 的替代甜品 💪 👀 前期回顾 NPM- 滚动进…

贷款行业极难获客,怎么获取实时客户数据?

我们能想象当客户有贷款需求时会发生什么吗? 客户可能会打开手机搜索“如何借款”、“哪笔贷款利息低”、“最多能借多少钱”、“贷款需要什么条件”等关键词,然后,客户点击进入第一个链接,然后填写他们的姓名和电话号码来测试他…

OpenAI最新官方GPT最佳实践指南,一文讲清ChatGPT的Prompt玩法

原文:Sina Visitor System OpenAI的官网发表万字GPT最佳实践指南,讲清Prompt提示词的原则和策略,这里是总结和全文翻译 原创图像,AI辅助生成 OpenAI的官网上刚刚发表一篇万字的GPT最佳实践指南,这份指南把写好Promp…

大语言模型对齐技术 最新论文及源码合集(外部对齐、内部对齐、可解释性)

大语言模型对齐(Large Language Model Alignment)是利用大规模预训练语言模型来理解它们内部的语义表示和计算过程的研究领域。主要目的是避免大语言模型可见的或可预见的风险,比如固有存在的幻觉问题、生成不符合人类期望的文本、容易被用来执行恶意行为等。 从必…

C++笔记之实现多态的所有方法

C笔记之实现多态的所有方法 文章目录 C笔记之实现多态的所有方法1.C中多态是是什么?请用简洁准确的话描述2.虚函数实现多态2.1.虚函数(Virtual Functions)2.2.纯虚函数(Pure Virtual Functions)2.3.虚析构函数&#xf…

vue学习part01

02_Vue简介_哔哩哔哩_bilibili Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 1.简介 2.常用用法 新项目一般vue3,老项目vue2 3.vue两种风格:选项式api(vue2)和组合式api(vue3) 两种方式实现累…

Scala集合操作

1 集合简介 Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改。即可以更改,添加,删除集合中的元素; 不可变集合类:不能被修改。对集合执行更改,…

基于单片机控制的GSM短信模块家庭防盗报警系统

博主主页:单片机辅导设计 博主简介:专注单片机技术领域和毕业设计项目。 主要内容:毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、内容1 设计任务和要求1 主要内容 二、系统总体方案2.1 系统整体设计思路2.2 系统方案设计 …

【入门Flink】- 03Flink部署

集群角色 Flik提交作业和执行任务,需要几个关键组件: 客户端(Client):代码由客户端获取并做转换,之后提交给JobManger JobManager:就是Fink集群里的“管事人”,对作业进行中央调度管理;而它获…