当前位置: 代码网 > it编程>前端脚本>Python > 【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序

2024年07月27日 Python 我要评论
在PyQt5中,可以使用信号和槽来处理控件的交互状态。控件状态表明了这个控件是否是可用的,比如一个按钮,通常使用灰色来表示为不可点击。

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

pyqt5窗口交互

在pyqt5中,可以使用信号和槽来处理控件的交互状态。
常见api如下所示
在这里插入图片描述

1.控件状态

控件状态表明了这个控件是否是可用的,比如一个按钮,通常使用灰色来表示为不可点击。在pyqt中,可以通过setenabled()函数来设置控件的使能状态,以下代码绘制了一个无法被点击的按钮:

# 0. 导入需要的包和模块
from pyqt5.qt import *  # 主要包含了我们常用的一些类, 汇总到了一块
import sys


# 1. 创建一个应用程序对象
app = qapplication(sys.argv)


# 2. 控件的操作
# 2.1 创建控件
window = qwidget()


# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("窗口是否可用")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)


#创建个子控件
btn = qpushbutton(window)
btn.settext("按钮")
btn.move(100,100)


#设置信号与槽
btn.pressed.connect(lambda :print("按钮被点击了"))


#查看按钮是否可用
print(btn.isenabled())

#设置按钮不可用
btn.setenabled(false)

#查看按钮是否可用
print("设置后",btn.isenabled())


# 2.3 展示控件
window.show()



# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行,可见设置按钮不可用之前,按钮状态是可用的。设置之后,按钮是灰色的,不可点击
在这里插入图片描述

2.控件可视化

在这里插入图片描述

只有窗口被绘制,才会被显示出来

可以通过setvisible()来设置一个控件是否可视,以下代码创建一个按键,但是设置为不可视:
setvisible()传递的参数值为true也不一定可见,主要还要看父控件的可见性
sethidden(bool) show() hide() 本质上还是调用了setvisible()方法

如下代码展示了,当调用了窗口对象show方法,就会触发绘制事件

# 0. 导入需要的包和模块
from pyqt5.qt import *  # 主要包含了我们常用的一些类, 汇总到了一块
import sys


# 1. 创建一个应用程序对象
app = qapplication(sys.argv)


class window(qwidget):
    #窗口绘制时,触发该事件
    def paintevent(self, evt):
        print("窗口被绘制了")
        #重写了父类方法,由于我们不做绘制逻辑,让父类方法绘制,所以将父类绘制方法返回
        return super().paintevent(evt)






# 2. 控件的操作
# 2.1 创建控件
window = window()


# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("控件可视化")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)



# 2.3 展示控件
window.show()



# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行
在这里插入图片描述

当我们将show方法注释,绘制事件就不会被触发
在这里插入图片描述

此时,我们使用setvisible()方法,依然会触发绘制事件

#设置窗口可见
window.setvisible(true)

在这里插入图片描述

使用sethidden()方法设置窗口可见性

window.sethidden(false)

在这里插入图片描述

窗口绘制的时候,先绘制主窗口,再绘制子控件

# 0. 导入需要的包和模块
from pyqt5.qt import *  # 主要包含了我们常用的一些类, 汇总到了一块
import sys


# 1. 创建一个应用程序对象
app = qapplication(sys.argv)


class window(qwidget):
    #窗口绘制时,触发该事件
    def paintevent(self, evt):
        print("窗口被绘制了")
        #重写了父类方法,由于我们不做绘制逻辑,让父类方法绘制,所以将父类绘制方法返回
        return super().paintevent(evt)


class btn(qpushbutton):
    def paintevent(self, evt):
        print("按钮被绘制了")
        #重写了父类方法,由于我们不做绘制逻辑,让父类方法绘制,所以将父类绘制方法返回
        return super().paintevent(evt)




# 2. 控件的操作
# 2.1 创建控件
window = window()


# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("控件可视化")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)


#创建按钮
btn = btn(window)
btn.settext("按钮")



# 2.3 展示控件
# window.show()

#设置窗口可见
# window.setvisible(true)
window.sethidden(false)

# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

运行可以看到,先绘主窗口,再绘制子控件 按钮
在这里插入图片描述

我们也可以设置当我们点击按钮时,隐藏按钮

btn.pressed.connect(lambda :btn.hide())

在这里插入图片描述

控制控件的显示和隐藏的本质是控制该控件是否被绘制

判定控件是否隐藏
在这里插入图片描述

ishidden() 判断控件是否设置了隐藏,如果没有设置隐藏,即使父控件不可见,该值获得的结果依然是 没有隐藏
在这里插入图片描述

isvisibleto(widget)
如果能随着widget控件的显示和隐藏, 而同步变化, 则返回true
在这里插入图片描述

3.控件是否被编辑

在这里插入图片描述

代码展示:

# 0. 导入需要的包和模块
from pyqt5.qt import *  # 主要包含了我们常用的一些类, 汇总到了一块
import sys


# 1. 创建一个应用程序对象
app = qapplication(sys.argv)


# 2. 控件的操作
# 2.1 创建控件
window = qwidget()


# 2.2 设置控件
#设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题
window.setwindowtitle("编辑窗口[*]")
#设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏
window.resize(500, 500)


#设置窗口是被编辑状态
window.setwindowmodified(true)

# 2.3 展示控件
window.show()



# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

设置被编辑状态,标题栏显示个星星
在这里插入图片描述

当没有设置为编辑状态,不显示星星
在这里插入图片描述

判断窗口是否处于被编辑状态

#获取窗口是否处于被编辑状态
print(window.iswindowmodified())

在这里插入图片描述

4.控件的关闭

具体api
window.close() #这种起始只是隐藏了按钮
setattribute(qt.wa_deleteonclose, true) #当设置了这个属性,设置按钮关闭时,就会释放按钮

只是关闭按钮,并不会触发destroyed事件
在这里插入图片描述

#设置属性
btn.setattribute(qt.wa_deleteonclose, true)

此时,关闭按钮,就会释放
在这里插入图片描述

5.控件交互综合案例

创建一个窗口, 包含一个文本框和一个按钮和一个标签
默认状态
标签隐藏
文本框和按钮显示
按钮设置为不可用状态

当文本框有内容时, 让按钮可用, 否则不可用
当文本框内容为jingtian时, 点击按钮则显示标签, 并展示文本为登录成功;否则为失败

代码展示

from pyqt5.qt import *

class window(qwidget):
    def __init__(self):
        super().__init__()
        self.setwindowtitle("交互状态案例的学习")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        # 添加三个子控件
        label = qlabel(self)
        label.settext("标签")
        label.move(100, 50)
        #默认让标签隐藏
        label.hide()

        #输入文本框
        le = qlineedit(self)
        # le.settext("文本框")
        le.move(100, 100)

        btn = qpushbutton(self)
        btn.settext("登录")
        btn.move(100, 150)
        btn.setenabled(false)

        #参数值就是输入的内容
        def text_cao(text):
            print("文本内容发生了改变", text)
            # if len(text) > 0:
            #     btn.setenabled(true)
            # else:
            #     btn.setenabled(false)
            btn.setenabled(len(text) > 0)
        #文件改变事件
        le.textchanged.connect(text_cao)

        def check():
            # print("按钮被点击了")
            # 1. 获取文本框内容
            content = le.text()
            # 2. 判定是否是jingtian
            if content == "jingtian":
                # 3. 是 -> 显示之前隐藏的提示标签, 展示文本
                label.settext("登录成功")
            else:
                label.settext("登录失败")

            #显示标签内容
            label.show()
            #设置标签尺寸自适应
            label.adjustsize()

        #点击登录按钮时触发
        btn.pressed.connect(check)


if __name__ == '__main__':
    import sys
    app = qapplication(sys.argv)

    window = window()
    window.show()


    sys.exit(app.exec_())

运行,当没有输入时,按钮是不可用状态
在这里插入图片描述

输入jigntian,点击登录,显示登录成功
在这里插入图片描述

输入其他内容,点击登录,显示登录失败
在这里插入图片描述

6.控件信息提示

一些控件当我们光标停留在上面的时候,会显示一个小框文本来提示。
提示大致分为三种,具体如下图所示
在这里插入图片描述

代码展示

# 0. 导入需要的包和模块
from pyqt5.qt import *
import sys


# 1. 创建一个应用程序对象
app = qapplication(sys.argv)

# 2. 控件的操作
# 2.1 创建控件
# window = qwidget()
#创建主窗口,里面的子控件懒加载
window = qmainwindow()
# 懒加载
# 用到的时候, 才会创建
window.statusbar() #设置状态栏

# 2.2 设置控件
window.setwindowtitle("信息提示")
window.resize(500, 500)

#把窗口模式改成带问号的,窗口上下文帮助按钮
window.setwindowflags(qt.windowcontexthelpbuttonhint)

# 当鼠标停留在窗口控件身上之后, 在状态栏提示的一段文本
window.setstatustip("这是窗口")

#获取状态栏提示
print(window.statustip())

label = qlabel(window)
label.settext("社会我景天哥")
#鼠标放在标签上时,触发状态栏显示相关内容
label.setstatustip("这是标签")

#设置工具栏提示,鼠标放到标签上时,直接在旁边提示
label.settooltip("这是一个提示标签")
#获取工具栏提示
print(label.tooltip())

#设置工具栏提示时长
label.settooltipduration(2000)
print(label.tooltipduration())

#鼠标变成一个问号时,点击鼠标显示设置内容
label.setwhatsthis("这是啥? 这是标签")


# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

当鼠标放在窗口上,状态栏显示
在这里插入图片描述

当鼠标放在标签上,状态栏和工具栏显示
在这里插入图片描述

当设置窗口模式,让鼠标变成问号,点击标签时显示
在这里插入图片描述

7.窗口焦点控制

当窗口中有多个控件时,鼠标焦点可能会聚焦到不同控件
焦点我们可以用鼠标点击,也可以按tab键切换
焦点在哪里,键盘输入就输入到哪里
只有获取焦点的控件,才能与用户交互
在这里插入图片描述

代码展示

# 0. 导入需要的包和模块
from pyqt5.qt import *
import sys

#继承,重写鼠标监听
class window(qwidget):
    def mousepressevent(self, evt):
        print("动态监听打印获取焦点的空间",self.focuswidget())
        #点击鼠标,焦点聚焦到下一个子控件
        # self.focusnextchild()
        #点击鼠标,焦点聚焦到上一个子控件
        # self.focuspreviouschild()
        #点击鼠标,焦点聚焦到下一个子控件 true是聚焦到下一个子控件,false是聚焦到上一个子控件
        # self.focusnextprevchild(true)

# 1. 创建一个应用程序对象
app = qapplication(sys.argv)

# 2. 控件的操作
# 2.1 创建控件
window = window()
# 2.2 设置控件
window.setwindowtitle("焦点控制")
window.resize(500, 500)


le1 = qlineedit(window)
le1.move(50, 50)

le2 = qlineedit(window)
le2.move(100, 100)

le3 = qlineedit(window)
le3.move(150, 150)

#设置子控件,按下tab键获取焦点的顺序
#settaborder是静态方法,直接用类来调用
window.settaborder(le1, le3)
window.settaborder(le3, le2)

#人为设置初始的焦点位置
# le2.setfocus()

#设置获取焦点的方式
# le2.setfocuspolicy(qt.tabfocus) #通过tab获取焦点
# le2.setfocuspolicy(qt.clickfocus) #通过鼠标点击获取焦点
# le2.setfocuspolicy(qt.strongfocus)  #可以通过鼠标和tab键获取焦点,默认是这种方式
# le2.setfocuspolicy(qt.nofocus)  #不能通过鼠标和tab键获取焦点,但可以通过setfocus仍可使其获得焦点

# le2.setfocus()

#取消焦点,这个一般配合setfocus()使用
# le2.clearfocus()




# 2.3 展示控件
window.show()

# print(le1)
# print(le2)
# print(le3)
#
# le2.setfocus()

# 获取当前窗口内部, 所有子控件当中获取焦点的那个控件
#要获取到,必须通过设置哪个控件获取焦点,才能获取到,如果没有设置,获取到的是none
print("获取当前光标聚焦的子控件",window.focuswidget())

# le1.clearfocus()

# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())

按tab切换光标焦点
在这里插入图片描述
当然,根据设置,点击鼠标也可以切换光标

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com