当前位置:首页 » 《随便一记》 » 正文

二,控件学习--3.QObject~QWidget(可视控件基类)_宋建国的博客

1 人参与  2022年04月12日 08:19  分类 : 《随便一记》  评论

点击全文阅读


继承关系

在这里插入图片描述

学习计划

在这里插入图片描述

功能作用

1.控件的创建

在这里插入图片描述

应用场景

  • 进行基本窗口的创建,以及父控件的指定
from PyQt5.Qt import *
import sys

app = QApplication(sys.argv)

window = QWidget()

red = QWidget(window)
red.resize(100,100)
red.setStyleSheet("background-color:red;")

window.show()

sys.exit(app.exec_())

2.窗口大小以及位置

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

应用场景

  • 改变控件位置
  • 计算控件占用尺寸
  • 九宫格显示控件案例如下:
import sys
from PyQt5.Qt import *


app = QApplication(sys.argv)

window = QWidget()

window.show()
window.resize(500, 500)
window.move(300, 300)

# 总的控件个数
widget_count = 10
# 一行有多少列
column_count = 3

# 计算一个控件的宽度
widget_width = window.width() / column_count
# 总共有多少行 (编号 // 一行多少列 + 1)
row_count = (widget_count - 1) // column_count + 1
widget_height = window.height() / row_count

for i in range(0, widget_count):
    w = QWidget(window)
    w.resize(widget_width, widget_height)
    widget_x = i % column_count * widget_width
    widget_y = i // column_count * widget_height
    w.move(widget_x, widget_y)
    w.setStyleSheet("background-color: red;border: 1px solid yellow;")
    w.show()

sys.exit(app.exec_())

3.控件最大和最小尺寸

在这里插入图片描述

应用场景

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

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

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("最小尺寸最大尺寸限定")
# window.resize(500, 500)
# window.setFixedSize(500, 500)
# window.setMinimumSize(200, 200)
window.setMaximumSize(500, 500)

# window.setMinimumWidth(500)
# window.setMaximumWidth(800)
window.resize(1000, 1000)

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

4.内容边距

在这里插入图片描述

应用场景

  • 调整控件内容边距, 使得显示更好看
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

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

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("内容边距的设定")
window.resize(500, 500)

label = QLabel(window)
label.setText("小香猪")
label.resize(300, 300)
label.setStyleSheet("background-color: cyan;")

#设置内容边距
label.setContentsMargins(100, 200, 0, 0)

#获得内容边距
print(label.getContentsMargins())

#获得内容区域
print(label.contentsRect())

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

5.鼠标相关设置

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

应用场景

  • api使用
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys


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

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("鼠标操作")
window.resize(500, 500)

#一,枚举鼠标标识:当鼠标移动到窗口内部就会变成禁止标志
# window.setCursor(Qt.ForbiddenCursor)

#二,进入label控件后鼠标变成禁止标志
# label = QLabel(window)
# label.setText("小香猪")
# label.resize(100,100)
# label.setStyleSheet("background-color:cyan;")
# label.setCursor(Qt.ForbiddenCursor)

#三,自定义鼠标标识
# pixmap = QPixmap("cursor.png")
# #更改图片大小并不是在原有pixmap上进行更改,而是返回一个新的
# pixmap = pixmap.scaled(200,200)
# #可以设置有效的点击位置 0,0 为左上角
# cursor = QCursor(pixmap,0,0)
# window.setCursor(cursor)

#四,重置鼠标形状,所有的形状设定都会失效
# window.unsetCursor()

#五,获取鼠标对象并进行操作
# current_cursor = window.cursor()
#   #获取到的是相对于整个桌面的位置
# print(current_cursor.pos())
#   #执行后鼠标会弹到桌面左上角
# current_cursor.setPos(0,0)

#六,鼠标跟踪
class MyWindow(QWidget):
	def mouseMoveEvent(self,me):
		print("鼠标移动了","鼠标全局位置(以桌面左上角为坐标点):",me.globalPos())
		print("鼠标移动了","鼠标局部位置(以用户界面左上角为坐标点):",me.localPos())

window = MyWindow()
#判断当前鼠标状态是否为跟踪状态:False,这个状态下只有点击左键才能进入跟踪状态
print(window.hasMouseTracking())
#设置鼠标跟踪
window.setMouseTracking(True)
#判断当前鼠标状态是否为跟踪状态:True
print(window.hasMouseTracking())


# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
  • 鼠标跟踪案例:非面向对象版本
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys


#重写一个窗口类,来重写鼠标移动函数
class window(QWidget):
	def mouseMoveEvent(self,me):
		print("鼠标移动了","鼠标局部位置(以用户界面左上角为坐标点):",me.localPos())
		#找到文本框的对象
		label = self.findChild(QLabel)
		#设置文本框跟踪鼠标移动
		label.move(me.localPos().x(),me.localPos().y())


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

# 2. 控件的操作
# 2.1 创建控件
window = window()
# 2.2 设置控件
window.setWindowTitle("鼠标跟踪案例")
window.resize(500, 500)
window.move(200,200)
#设置鼠标跟踪
window.setMouseTracking(True)

#将鼠标标识改变为自定义标识
pixmap = QPixmap("cursor.png")
#更改图片大小并不是在原有pixmap上进行更改,而是返回一个新的
pixmap = pixmap.scaled(200,200)
#可以设置有效的点击位置 0,0 为左上角
cursor = QCursor(pixmap,0,0)
window.setCursor(cursor)


#创建一个带有样式的文字
label = QLabel(window)
label.setText("小香猪")
label.move(100,100)
label.setStyleSheet("background-color:cyan;")


# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
  • 鼠标跟踪案例:面向对象版本
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys


#重写一个窗口类,来重写鼠标移动函数
class window(QWidget):
	def __init__(self):
		super().__init__()  
		#2.2 设置控件
		self.setWindowTitle("鼠标跟踪案例")
		self.resize(500, 500)
		self.move(200,200)
		#设置鼠标跟踪
		self.setMouseTracking(True)

		#将鼠标标识改变为自定义标识
		pixmap = QPixmap("cursor.png")
		#更改图片大小并不是在原有pixmap上进行更改,而是返回一个新的
		pixmap = pixmap.scaled(200,200)
		#可以设置有效的点击位置 0,0 为左上角
		cursor = QCursor(pixmap,0,0)
		self.setCursor(cursor)


		#创建一个带有样式的文字
		label = QLabel(self)
		self.label = label
		label.setText("小香猪")
		label.move(100,100)
		label.setStyleSheet("background-color:cyan;")

	def mouseMoveEvent(self,me):
		print("鼠标移动了","鼠标局部位置(以用户界面左上角为坐标点):",me.localPos())
		#找到文本框的对象
		# label = self.findChild(QLabel)
		#设置文本框跟踪鼠标移动
		self.label.move(me.localPos().x(),me.localPos().y())


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

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


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

6.事件

在这里插入图片描述

应用场景

  • 事件消息部分api使用展示
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):
        pass

    def showEvent(self, QShowEvent):
        print("窗口被展示了出来")

    def closeEvent(self, QCloseEvent):
        print("窗口被关闭了")

    def moveEvent(self, QMoveEvent):
        print("窗口被移动了")

    def resizeEvent(self, QResizeEvent):
        print("窗口改变了尺寸大小")

    def enterEvent(self, QEvent):
        print("鼠标进来了")
        self.setStyleSheet("background-color: yellow;")

    def leaveEvent(self, QEvent):
        print("鼠标移开了")
        self.setStyleSheet("background-color: green;")


    def mousePressEvent(self, QMouseEvent):
        print("鼠标被按下")

    def mouseReleaseEvent(self, QMouseEvent):
        print("鼠标被释放")

    def mouseDoubleClickEvent(self, QMouseEvent):
        print("鼠标双击")

    def mouseMoveEvent(self, QMouseEvent):
        print("鼠标移动了")

    def keyPressEvent(self, QKeyEvent):
        print("键盘上某一个按键被按下了")

    def keyReleaseEvent(self, QKeyEvent):
        print("键盘上某一个按键被释放了")

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

    window = Window()
    window.show()

    sys.exit(app.exec_())
  • 事件转发问题:子控件不处理事件会转发到父控件来处理,一直向上传。
# 0. 导入需要的包和模块
from PyQt5.Qt import * 
import sys

class Window(QWidget):
    def mousePressEvent(self, QMouseEvent):
        print("顶层窗口鼠标按下")

class MidWindow(QWidget):
    def mousePressEvent(self, evt):
        print("中间控件被按下")
        print(evt.isAccepted(),"中间事件处理了")
        
        #标识事件没有被处理,所以会向父对象进行转发
        evt.ignore()


class Label(QLabel):
    def mousePressEvent(self, evt):
        print("标签控件鼠标按下")

        #告诉系统这个事件已经处理了,不需要转发
        # evt.accept()
        #显示事件是否被处理
        print(evt.isAccepted(),"标签事件处理了")

        #标识事件没有被处理,所以会向父对象进行转发
        evt.ignore()

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

# 2. 控件的操作
# 2.1 创建控件
window = Window()
# 2.2 设置控件
window.setWindowTitle("事件转发")
window.resize(500, 500)

#新建中间控件
mid_window = MidWindow(window)
mid_window.resize(300, 300)
#使样式生效,不加不会生效,后面学习会解释为什么会这样
mid_window.setAttribute(Qt.WA_StyledBackground, True)
mid_window.setStyleSheet("background-color: yellow;")

#新建标签控件
label = Label(mid_window)
label.setText("这是一个标签")
label.setStyleSheet("background-color: red;")
label.move(100, 100)

#按钮自带按钮点击处理事件,所以并没有向父控件转发,点击无输出
btn = QPushButton(mid_window)
btn.setText("我是按钮")
btn.move(50, 50)

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

在这里插入图片描述

  • 事件案例一:进去界面显示欢迎光临,出界面显示谢谢惠顾
 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

class MyLabel(QLabel):
    def enterEvent(self, *args, **kwargs):
        print("鼠标进入")
        self.setText("欢迎光临")

    def leaveEvent(self, *args, **kwargs):
        print("鼠标离开")
        self.setText("谢谢惠顾")

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

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("鼠标操作的案例1")
window.resize(500, 500)
window.move(300,300)

label = MyLabel(window)
label.resize(200, 200)
label.move(100, 100)
label.setStyleSheet("background-color: cyan;")

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

在这里插入图片描述

  • 事件案例二:监听用户键盘按下Tab键以及按键组合
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

class MyLabel(QLabel):
    def keyPressEvent(self, evt):
        if evt.key() == Qt.Key_Tab:
            print("用户点击了Tab键位")
        else:
            print("用户点击了按键")

        #evt.modifiers()代表修饰键,按位或表示两个都要按下
        if evt.modifiers() == Qt.ControlModifier | Qt.ShiftModifier and evt.key() == Qt.Key_A:
            print("ctrl + Shift + A被点击了")

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

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("鼠标操作的案例1")
window.resize(500, 500)
window.move(300,300)

label = MyLabel(window)
label.resize(200, 200)
label.move(100, 100)
label.setStyleSheet("background-color: cyan;")

#设定所有的键盘按键都被标签控件接受,如果不加的话系统不知道是哪个控件接受,所以不会执行后续函数
label.grabKeyboard()

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

在这里插入图片描述

  • 案例三:用户区拖拽
# 0. 导入需要的包和模块
from PyQt5.Qt import * 

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.move_flag = False
        # 2.2 设置控件
        self.setWindowTitle("窗口拖拽")
        self.resize(500, 500)
        self.setup_ui()

    def setup_ui(self):
        pass

    def mousePressEvent(self,QMouseEvent):
        #判断是否为鼠标左键按下,才执行操作
        if QMouseEvent.button() == Qt.LeftButton:
            self.move_flag = True
            # print("鼠标按下了")
            #确定两个点:鼠标第一次按下的点,窗口当前所在的原始点
            self.mouse_x = QMouseEvent.globalX()
            self.mouse_y = QMouseEvent.globalY()

            self.origin_x = self.x()
            self.origin_y = self.y()

    def mouseMoveEvent(self,QMouseEvent):
        if self.move_flag:
            # print("鼠标移动了")
            # print(QMouseEvent.globalX(),QMouseEvent.globalY())
            #计算出移动向量,移动的固定点为桌面左上角,因为他不会动!
            move_x = QMouseEvent.globalX() - self.mouse_x
            move_y = QMouseEvent.globalY() - self.mouse_y

            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y

            self.move(dest_x,dest_y)

    def mouseReleaseEvent(self,QMouseEvent):
        self.move_flag = False
        print("鼠标释放了")

if __name__ == '__main__':
    import sys

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

    # 2. 控件的操作
    # 2.1 创建控件
    window = Window()
    # 2.3 展示控件
    window.show()
    # 3. 应用程序的执行, 进入到消息循环
    sys.exit(app.exec_())

7.父子关系

在这里插入图片描述

应用场景

  • api使用
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys


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

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("父子关系学习")
window.resize(500, 500)

label1 = QLabel(window)
# label1.setParent(window)
label1.setText("标签1")
label1.move(200, 200)

label2 = QLabel(window)
# label2.setParent(window)
label2.setText("标签2")
label2.move(50, 50)

label3 = QLabel(window)
# label3.setParent(window)
label3.setText("标签3")
label3.move(100, 100)

#展示父控件和三个子控件的内存地址
print(window,label1,label2,label3)
#显示在100,100位置的控件对应的内存地址
print(window.childAt(100, 100))
#显示label2的父控件的内存地址
print(label2.parentWidget())
#展示所有子控件形成的边界矩形
print(window.childrenRect())


# 2.3 展示控件
window.show()
# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
  • 案例:
    在这里插入图片描述
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

class Window(QWidget):
    def mousePressEvent(self, evt):
        local_x = evt.x()
        local_y = evt.y()
        #获取点击位置的控件
        sub_widget = self.childAt(local_x, local_y)
        #如果存在控件就改变其样式
        if sub_widget is not None:
            sub_widget.setStyleSheet("background-color: red;")
        print("被点击了", local_x, local_y)

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

# 2. 控件的操作
# 2.1 创建控件
window = Window()
# 2.2 设置控件
window.setWindowTitle("父子关系案例")
window.resize(500, 500)

#循环创建10个标签控件
for i in range(1, 11):
    label = QLabel(window)
    label.setText("标签" + str(i))
    label.move(40*i, 40*i)

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

8.层级控制

在这里插入图片描述

应用场景

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

class Label(QLabel):
    def mousePressEvent(self, evt):
        #层级向下
        # self.lower()
        #层级向上
        self.raise_()

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

# 2. 控件的操作
# 2.1 创建控件
window = QWidget()
# 2.2 设置控件
window.setWindowTitle("层级关系调整")
window.resize(500, 500)

label1 = Label(window)
label1.setText("标签1")
label1.resize(200, 200)
label1.setStyleSheet("background-color: red;")

label2 = Label(window)
label2.setText("标签2")
label2.resize(200, 200)
label2.setStyleSheet("background-color: green;")
label2.move(100, 100)

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

9.顶层窗口相关

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

应用场景

  • api使用
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

class Window(QWidget):
    def mousePressEvent(self, QMouseEvent):

        if self.isMaximized():
            #显示正常活动状态
            self.showNormal()
        else:
            self.showMaximized()

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

# 2. 控件的操作
# 2.1 创建控件
window = Window()
# 2.2 设置控件
window.resize(500, 500)
window.setWindowTitle("窗口api使用")

#一,设置窗口图标
icon = QIcon("rose.png")
window.setWindowIcon(icon)

#二,设置窗口标题
window.setWindowTitle("小香猪")
print(window.windowTitle())

#三,设置窗口不透明度
window.setWindowOpacity(0.9)
print(window.windowOpacity())

#四,设置窗口状态
# window.setWindowState(Qt.WindowMinimized)#最小化
# window.setWindowState(Qt.WindowMaximized)#最大化
# window.setWindowState(Qt.WindowFullScreen)#全屏

#五,控制窗口状态
# window.showFullScreen()
# window.showMaximized()
# window.showMinimized()

# 2.3 展示控件
window.show()

# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
  • 案例
    在这里插入图片描述
# 0. 导入需要的包和模块
from PyQt5.Qt import * 
import sys

class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        #去除窗口自带的标题栏,也就不能改变大小了
        self.setWindowFlags(Qt.FramelessWindowHint)
        #设置窗口不透明度0.9
        self.setWindowOpacity(0.9)
        # 2.2 设置控件
        self.setWindowTitle("顶层窗口操作-案例")
        self.resize(500, 500)

        #设置拖拽移动标志
        self.move_flag = False

        # 公共数据
        #距离上边框距离
        self.top_margin = 10
        #设置按钮宽
        self.btn_w = 80
        #设置按钮高
        self.btn_h = 40
        
        #加载子控件
        self.setup_ui()

    def setup_ui(self):

        # 添加三个子控件 - 窗口的右上角
        close_btn = QPushButton(self)
        self.close_btn = close_btn
        close_btn.setText("关闭")
        close_btn.resize(self.btn_w, self.btn_h)

        max_btn = QPushButton(self)
        self.max_btn = max_btn
        max_btn.setText("最大化")
        max_btn.resize(self.btn_w, self.btn_h)

        mini_btn = QPushButton(self)
        self.mini_btn = mini_btn
        mini_btn.setText("最小化")
        mini_btn.resize(self.btn_w, self.btn_h)

        def max_normal():
            if self.isMaximized():
                self.showNormal()
                max_btn.setText("最大化")
            else:
                self.showMaximized()
                max_btn.setText("恢复")

        #信号连接关闭的槽函数
        close_btn.pressed.connect(self.close)
        #信号连接最大化槽函数
        max_btn.pressed.connect(max_normal)
        #信号连接最小化槽函数
        mini_btn.pressed.connect(self.showMinimized)

    #调整按钮位置,窗口大小改变事件,一开始就会执行一次
    def resizeEvent(self, QResizeEvent):
        print("窗口大小发生了改变")
        # close_btn_w = btn_w
        window_w = self.width()
        close_btn_x = window_w - self.btn_w
        close_btn_y = self.top_margin
        self.close_btn.move(close_btn_x, close_btn_y)

        max_btn_x = close_btn_x - self.btn_w
        max_btn_y = self.top_margin
        self.max_btn.move(max_btn_x, max_btn_y)

        mini_btn_x = max_btn_x - self.btn_w
        mini_btn_y = self.top_margin
        self.mini_btn.move(mini_btn_x, mini_btn_y)

    def mousePressEvent(self, QMouseEvent):
        #判断是否为鼠标左键按下,才执行操作
        if QMouseEvent.button() == Qt.LeftButton:
            self.move_flag = True
            # print("鼠标按下了")
            #确定两个点:鼠标第一次按下的点,窗口当前所在的原始点
            self.mouse_x = QMouseEvent.globalX()
            self.mouse_y = QMouseEvent.globalY()

            self.origin_x = self.x()
            self.origin_y = self.y()

    def mouseMoveEvent(self, QMouseEvent):
        if self.move_flag:
            # print("鼠标移动了")
            # print(QMouseEvent.globalX(),QMouseEvent.globalY())
            #计算出移动向量,移动的固定点为桌面左上角,因为他不会动!
            move_x = QMouseEvent.globalX() - self.mouse_x
            move_y = QMouseEvent.globalY() - self.mouse_y

            dest_x = self.origin_x + move_x
            dest_y = self.origin_y + move_y

            self.move(dest_x,dest_y)

    def mouseReleaseEvent(self, QMouseEvent):
        self.move_flag = False
        # print("鼠标释放了")
        
# 1. 创建一个应用程序对象
app = QApplication(sys.argv)

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

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

10.交互状态

在这里插入图片描述

应用场景

  • api使用
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

class Window(QWidget):
    def paintEvent(self, evt):
        print("窗口被绘制了")
        return super().paintEvent(evt)

class Btn(QPushButton):
    def paintEvent(self, evt):
        print("按钮被绘制了")
        return super().paintEvent(evt)

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

# 2. 控件的操作
# 2.1 创建控件
window = Window()
# 2.2 设置控件
window.setWindowTitle("交互状态")
window.resize(500, 500)

btn = Btn(window)
btn.setText("按钮")
btn.pressed.connect(lambda : print("按钮被按下了"))
btn.destroyed.connect(lambda : print("按钮被删除了"))

#设置按钮隐藏的三种方法
# btn.setVisible(False)#1
# btn.setHidden(True)#2
# btn.hide()#3

#设置按钮关闭/删除四种方法
# btn.deleteLater()#删除

#设置下次关闭某个控件的时候将其删除
# btn.setAttribute(Qt.WA_DeleteOnClose, True)

# btn.close()#删除

# btn.setVisible(False)#隐藏,不删除

# 2.3 展示控件
window.show()

# 3. 应用程序的执行, 进入到消息循环
sys.exit(app.exec_())
  • 案例:
    在这里插入图片描述
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. 判定是否是Sz
            if content == "Sz":
                # 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_())

11.信息提示

在这里插入图片描述

应用场景

# 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_())

12.焦点控制

在这里插入图片描述

应用场景

  • api使用
# 0. 导入需要的包和模块
from PyQt5.Qt import *
import sys

#设置点击空白部分时,跳转焦点的方式
class Window(QWidget):
    def mousePressEvent(self, evt):
        # print(self.focusWidget())
        # self.focusWidget()
        self.focusNextChild()
        # self.focusPreviousChild()
        # 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的焦点跳转顺序
QWidget.setTabOrder(le1, le3)
QWidget.setTabOrder(le3, le2)

#设置获得焦点方式
# le2.setFocus()
# le2.setFocusPolicy(Qt.TabFocus)
# le2.setFocusPolicy(Qt.ClickFocus)
# le2.setFocusPolicy(Qt.StrongFocus)

#设置与清空焦点
# le2.setFocus()
# le2.clearFocus()

# 2.3 展示控件
window.show()

# 获取当前窗口内部, 所有子控件当中获取焦点的那个控件
le2.setFocus()
print(window.focusWidget())

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/37839.html

控件  鼠标  设置  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1