【GUI-pyqt5】QObject类

news2025/1/7 5:48:27

1. QObject模块详解

1.1 描述

所有Qt对象的父类

1.2 功能和作用

1.2.1 对象名称和属性

1.2.1.1 API
API功能备注
setObjectName("唯一名称")
给一个Qt对象设置一个名称
一般这个名称是唯一的,当做对象ID来使用
objectName()
获取一个对象名称
-
setProperty("属性名称", 值)
给一个Qt对象动态添加一个属性与值
-
property("属性名称")
获取一个对象的属性值
-
dynamicPropertyNames()
获取一个对象值所有通过setProperty()设置的属性名称
-
1.2.1.2 应用场景
  1. 用于qss的ID选择器,属性选择器,方便统一设置样式
  2. 用于装饰器的信号与槽
1.2.1.3 使用案例1
from PyQt5.Qt import *
import sys

class Window(Qwidget):
	def __init__(self):
		"""初始化方法"""
		super().__init__()
		# 设置窗口大小
		self.resize(500, 500)
		# 设置窗口标题栏名称
		self.setWindowTitle("Object")
		self.initUI()
	
    def initUI(self):
        """调用方法"""
        # self.QObject_text()
        self.QObject_caozuo()

    def QObject_text(self):
        """QObject模块学习"""
        # 查看QObject继承父类
        mros = QObject.mro()
        for mro in mros:
            print(mro)

    def QObject_caozuo(self):
        """测试API方法"""
        obj = QObject()
        # 给QT对象设置一个名称
        obj.setObjectName('notice')
        print(obj.objectName())

        # 给QT对象动态添加一个属性与值
        obj.setProperty('notice_level', 'error')
        obj.setProperty('notice_level1', 'Info')
        print(obj.property('notice_level1'))

        # 获取一个对象中所有通过setProperty()设置的属性名称
        print(obj.dynamicPropertyNames())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.1.4 使用案例2

要求: 创建多个用于信息提示的QLabel

  1. 凡是提示的QLabel控件,都要求设置①字体大小为25px;②字体颜色为灰色;③边框圆角为8px;
  2. 信息提示分为多个级别①正常(normal):绿色字体及边框;②警告(warning):黄色字体及边框;③错误(error):红色字体及边框;

QObject.qss文件

QLabel#notice {
    font-size: 20px;
    color: gray;
    border: 1px solid gray;
    border-radius: 8px;
}
QLabel#notice[notice_level="normal"] {
    color: green;
    border-color: green;
}
QLabel#notice[notice_level="warning"] {
    color: yellow;
    border-color: yellow;
}
QLabel#notice[notice_level="error"] {
    color: red;
    border-color: red;
}

qss_test.py文件

from PyQt5.Qt import *
import sys

class Window(QWidget):
    def __init__(self):
        """Qt初始化"""
        super().__init__()
        self.setWindowTitle('QSS案例')
        self.resize(500, 500)
        self.initUI()

    def initUI(self):
        """Qt API方法调用函数"""
        # 调用QSS测试方法
        self.qss_style()
        # 调用加载QSS样式表方法
        self.QSS_test()

    def QSS_test(self):
        """QSS初体验"""
        # 设置label1样式
        label1 = QLabel(self)
        label1.setText('normal')
        label1.setObjectName('notice')
        label1.setProperty('notice_level', 'normal')

        # 设置label2样式
        label2 = QLabel(self)
        label2.setText('warring')
        label2.setObjectName('notice')
        label2.setProperty('notice_level', 'warring')
        label2.move(100, 0)

        # 设置label3样式
        label3 = QLabel(self)
        label3.setText('error')
        label3.setObjectName('notice')
        label3.setProperty('notice_level', 'error')
        label3.move(200, 0)

    def qss_style(self):
        """加载qss样式函数"""
        with open('./QObject.qss', 'r') as f:
            qApp.setStyleSheet(f.read())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.2 父子对象操作

1.2.2.1 API
API功能备注
setParent(parent)
设置父对象
父对象只能设置一个
parent()
获取父对象
-
children()
获取所有直接子对象
-
findChild(参数1, 参数2, 参数3)
获取某一个指定名称或类型的对象
参数1:类型(Object),类型元组(QPushButton、QLabel);     参数2:名称(notice),可以省略;     参数3:查找选项Qt.FindChildrenRecursively(递归查找,默认选项),Qt.FindDirectChildrenOnly(只查找直接子对象)
findChildren(参数1, 参数2, 参数3)
获取某多个指定名称或类型的对象
参数1:类型(Object),类型元组(QPushButton、QLabel);     参数2:名称(notice),可以省略;     参数3:查找选项Qt.FindChildrenRecursively(递归查找,默认选项),Qt.FindDirectChildrenOnly(只查找直接子对象)
1.2.2.2 应用场景
1.2.2.2.1 Qt对象内存管理机制
1.2.2.2.1.1 QObject继承树
  1. 所有对象都是直接或间接的继承QObject
  2. QObjects在一个对象树中组织他们自己
    1. 当创建一个QObject时,如果使用了其他对象作为其父对象,那么他就会被添加到父对象的children()列表中
  3. 当父对象被销毁时,这个QObject也会被销毁
1.2.2.2.1.2 QWidget
  1. 扩展了父子关系
  2. 当一个控件设置了父控件
    1. 会包含在父控件内部
    2. 收父控件区域裁剪
    3. 父控件被删除时,子控件会自动删除
1.2.2.2.2 多个顶层窗口互相独立

如果一个控件,没有任何父控件,那么就会被当成顶层控件

1.2.2.2.3 如果一个控件被包含在另外一个控件内部,就需要设置父子关系
  1. 显示位置收父控件约束
  2. 生命周期也被父对象接管
1.2.2.3 示例
from PyQt5.Qt import *
import sys

class Window(QWidget):
    def __init__(self):
        """初始化方法"""
        super().__init__()
        self.resize(500, 500)
        self.setWindowTitle('对象的父子关系操作')
        self.initUI()

    def initUI(self):
        """调用函数"""
        self.parent_children()

    def parent_children(self):
        """QObject父子关系测试方法"""
        obj1 = QObject()
        obj2 = QObject()
        obj3 = QObject()
        print('obj1:', obj1)
        print('obj2:', obj2)
        print('obj3:', obj3)
        print("+++++"*5)

        # 设置obj1, 3父对象为obj2
        obj1.setParent(obj2)
        obj3.setParent(obj2)
        # 检测obj1的父对象
        print(obj1.parent())
        print("+++++"*5)
        # 打印obj2所有子对象
        print(obj2.children())
        print("+++++"*5)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.3 信号与槽 (重要)

1.2.3.1 基本概念
  1. Signal和Slot是Qt中的核心机制,主要作用于对象之间进行通信
  2. 信号: 当一个控件的状态发生改变时,向外界发出信息
  3. 槽: 一个执行某些操作的函数/方法
  4. 所有继承自QWidget的控件都支持“信号与槽”机制
1.2.3.2 机制描述
  1. 手动操作:信号 connect 槽
  2. 自动操作:当信号发出时,连接的槽函数会自动执行
1.2.3.3 基本使用
  1. 信号:控件内置的一些,也可以自定义
    1. QPushButton().presssed
    2. QPushButton().clicked
  2. 槽:不同控件内置槽函数,自定义函数和方法
  3. 连接方式:object.信号.connect(槽函数)
  4. 特性:
    1. 一个信号可以连接多个槽函数
    2. 一个信号也可以连接另外一个信号
    3. 信号的参数可以是python任何类型
    4. 一个槽可以监听多个信号
1.2.3.4 其他操作
  1. 自定义信号:带参数
  2. 信号的操作:连接、断开、发射
  3. 自定义槽函数lambda表达式
  4. 装饰器信号

1.2.4 QObject信号处理

1.2.4.1 API
API功能备注
widget.信号.connect(槽)
连接信号与槽
-
obj.disconnect()
取消连接信号与槽
①obj为控件:取消控件的所有信号连接;②obj为信号:取消指定信号连接
widget.blockSignals(bool)
临时(取消)阻止指定控件所有信号与槽连接
-
widget.blocked()
信号是否被阻止
-
widget.receivers(信号)
临返回连接信号接收器的数量
-
1.2.4.2 应用场景
  1. 监听信号,影响用户行为
  2. 信号与槽机制(参见1.2.3)
1.2.4.3 案例
from PyQt5.Qt import *

import sys

class Window(QWidget):
    def __init__(self):
        """初始化方法"""
        super().__init__()
        self.setWindowTitle('信号与槽函数')
        self.resize(500, 500)
        self.initUI()

    def initUI(self):
        """调用函数"""
        self.def_cao()

    def def_cao(self):
        """槽函数测试方法"""
        self.obj = QObject()

        def destory_cao(obj):
            print('对象被释放', obj)

        def objectName_cao(name):
            print('对象名称发生改变', name)

        # 对象被释放
        self.obj.destroyed.connect(destory_cao)
        # 对象名称发生改变
        self.obj.objectNameChanged.connect(objectName_cao)
        # 修改对象名称
        self.obj.setObjectName('xxx')

        # 断开槽与信号的连接
        # self.obj.objectNameChanged.disconnect()
        # 临时取消槽连接
        self.obj.blockSignals(True)
        # 槽已经断开,触发后无效果
        self.obj.setObjectName('ooo')
        # 恢复槽连接
        self.obj.blockSignals(False)
        self.obj.setObjectName('xxoo')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.4.4 案例2

当用户点击按钮的时候, 打印"点我嘎哈?"

from PyQt5.Qt import *
import sys

class Window(QWidget):
    def __init__(self):
        """初始化方法"""
        super().__init__()
        self.resize(500, 500)
        self.setWindowTitle('信号处理')
        self.initUI()

    def initUI(self):
        """调用函数"""
        self.single_and_slot()

    def single_and_slot(self):
        """信号与槽测试方法"""
        btn = QPushButton(self)
        btn.setText('点我!')
        btn.clicked.connect(self.cao)

    def cao(self):
        print('点我干啥!!!')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.4.5 案例3

在所有修改的窗口标题前, 添加前缀"xujie-"
要求: 创建多个用于信息提示的QLabel

  1. 比如, 后续我们修改标题为"Hello World!!“; 最终会自动变为"xujie-Hello World!!”
  2. 支持多次修改
from PyQt5.Qt import *

import sys

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    # 连接窗口标题变化的信号与槽函数
    def cao(tittle):
        print('PASS!!', tittle)
        # 断开槽连接
        window.windowTitleChanged.disconnect()
        # 或者使用临时终止window.blockSignals(True)
        window.setWindowTitle('xujie-' + tittle)
        window.windowTitleChanged.connect(cao)
        # 或者使用解除临时终止window.blockSignals(False)

    window.windowTitleChanged.connect(cao)
    window.setWindowTitle('Hello world!')
    window.setWindowTitle('Hello world2!')
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.5 类型判定

1.2.5.1 API
API功能备注
isWidgetType()
是否是控件类型
继承自QWidget类的
inherits(父类)
一个对象是否直接或间接继承自某个类
-
1.2.5.2 应用场景

过滤筛选条件

1.2.5.3 案例1
from PyQt5.Qt import *

import sys

class Window(QWidget):
    def __init__(self):
        """初始化方法"""
        super().__init__()
        self.setWindowTitle('类型判定')
        self.resize(500, 500)
        self.initUI()

    def initUI(self):
        """调用函数"""
        self.type_decide()

    def type_decide(self):
        """类型判断测试方法"""
        obj = QObject()
        wig = QWidget()
        btn = QPushButton()
        label = QLabel()

        a = [obj, wig, btn, label]
        for aa in a:
            if aa.isWidgetType():
                print(aa, '是控件')
            else:
                print(aa, '不是控件')
            if aa.inherits('QWidget'):
                print(aa, '继承自QWidget')
            else:
                print(aa, '不是继承自QWidget')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.5.4 案例2

创建一个窗口,包含多个QLabel或其他控件
要求: 将包含在窗口内所有的QLabel控件,设置背景色cyan

from PyQt5.Qt import *

import sys

class Window(QWidget):
    def __init__(self):
        """初始化方法"""
        super().__init__()
        self.setWindowTitle('类型判定')
        self.resize(500, 500)
        self.initUI()

    def initUI(self):
        """调用函数"""
        self.type_decide()

    def type_decide(self):
        """类型判定方法"""
        label1 = QLabel(self)
        label1.setText('label a')
        label2 = QLabel(self)
        label2.setText('label b')
        label2.move(100, 0)
        btn = QPushButton('btn a', self)
        btn.move(200, 0)

        a = [label1, label2, btn]
        for widget in a:
            if widget.inherits('QLabel'):
                widget.setStyleSheet('background-color: cyan;')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.6 对象删除

1.2.6.1 API
API功能备注
obj.deleteLater
删除一个对象时,也会解除它与父对象之间的关系
①deleteLater()并没有将对象立即销毁,而是往主循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象;②好处:可以在延迟删除时间内完成一些操作;坏处:内存释放不及时
1.2.6.2 应用场景

想要移除某一个对象时使用

1.2.6.3 案例
from PyQt5.Qt import *
import sys

class Window(QWidget):
    def __init__(self):
        """初始化方法"""
        super().__init__()
        self.resize(500, 500)
        self.setWindowTitle('对象删除')
        self.initUI()

    def initUI(self):
        """调用方法"""
        self.delete_object()

    def delete_object(self):
        """对象删除方法"""
        obj1 = QObject()
        self.obj1 = obj1
        obj2 = QObject()
        obj3 = QObject()

        obj3.setParent(obj2)
        obj2.setParent(obj1)

        # 观察obj是否被释放
        obj1.destroyed.connect(lambda x:print('obj1被释放'))
        obj2.destroyed.connect(lambda x:print('obj2被释放'))
        obj3.destroyed.connect(lambda x:print('obj3被释放'))

        # 观察obj1是否有子控件
        print(obj1.children())

        # del方法不可使用
        # del obj2
        # deleteLater方法
        obj2.deleteLater()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.7 事件机制

1.2.7.1 相当于信号与槽机制
  1. 信号与槽机制是对事件机制的高级封装
  2. 事件机制更偏底层(远离用户)
1.2.7.2 图解

在这里插入图片描述

1.2.7.3 应用
  1. 一般情况下,我们直接通过内置的信号与槽就可以解决一般通讯问题
    1. 例:QPushButton的clicked信号
  2. 有些控件并没有提供我们想要的信号,我们就需要自己重写具体的事件函数,来捕获产生的事件,做相应的处理
    1. 例:Qlabel并没有clicked信号
  3. 某些场景并不会吧我们想要捕获的事件传递给特定函数,而是做了其他的额外处理,此时我们开头重写事件的分发函数
    1. 列:想捕获用户的tab点击
      1. 当用户点击了tab键,默认是切换焦点
      2. 并不会把这个事件分发给keyPressEvent函数
      3. 此时,需要我们重写event,来做分发处理
  4. 如果想要同时多多个不同的控件进行捕获tab点击,那么每个都重写event()函数,也是非常麻烦,那么可以考虑事件过滤器
  5. QApplication对象的事件过滤器,可以拦截所有的QObject事件,一般不怎么使用
  6. QApplication对象的notify()更不怎么用,会大大降低程序性能
1.2.7.4 事件的传递
  1. 如果一个控件没有处理该事件,则会自动传递给父控件进行处理
  2. 事件对象具备两个特殊的方法
    1. accept():自己处理了这个事件,并告诉系统不要向上层传递
    2. ignore():自己忽略了该事件,告诉系统,继续往后传递下去
1.2.7.5 QObject事件处理
1.2.7.5.1 API(后续介绍)

childEvent()、customEvent()、eventFilter()、installEventFilter()、removeEventFilter()、event()

1.2.7.5.2 应用场景
  1. 事件机制(参见1.2.7)
  2. 拦截事件,监听特定行为
1.2.7.6 案例
from PyQt5.Qt import *

import sys

class App(QApplication):
    def notify(self, a0, a1):
        if a0.inherits("QPushButton") and a1.type() == QEvent.MouseButtonPress:
            print(a0, a1)

        return super().notify(a0, a1)

class Btn(QPushButton):
    def event(self, e):
        if e.type() == QEvent.MouseButtonPress:
            print(e)
        
        return super().event(e)

    def mousePressEvent(self, *args, **kwargs):
        print('按钮被按下了。。。。。。')
        return super().mousePressEvent(*args, **kwargs)

if __name__ == '__main__':
    app = App(sys.argv)
    windows = QWidget()
    windows.resize(500, 500)
    btn = Btn(windows)
    btn.setText('点击按钮')
    btn.move(200, 220)
    def cao():
        print('不要点我!!')
    btn.pressed.connect(cao)

    windows.show()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

1.2.8 定时器

1.2.8.1 API
API功能备注
startTimer(ms, Qt.TimerType)-> time_id
开启一个定时器
Qt.TimerType:①Qt.PreciseTimer:精确定时器,尽可能保持毫秒准确;②Qt.CoarseTimer:粗定时器,5%的误差间隔;③Qt.VeryCoarseTimer:很粗定时器,只能到秒级; timer_id:定时器唯一标识
killTimer(timer_id)
根据定时器id,杀死定时器
-
timerEvent()
定时器执行事件
-
1.2.8.2 应用场景
  1. 轮询
  2. 倒计时
1.2.8.3 案例1

创建一个窗口,并设计一个子控件label
要求:

  1. 展示10秒倒计时
  2. 倒计时结束,就停止计时
from PyQt5.Qt import *
import sys


class Mylabel(QLabel):
    def __init__(self, *args, **kwargs):
        """初始化方法"""
        super().__init__(*args, **kwargs)
        self.setText('10')
        self.move(200, 220)
        self.setStyleSheet('font-size: 22px;')
        self.timer_id = self.startTimer(1000)

    def setSec(self, sec):
        """设置倒计时时间方法"""
        self.setText(str(sec))

    def startMyTimer(self, ms):
        """设置时间间隔方法"""
        self.timer_id = self.startTimer(ms)

    def timerEvent(self, a0):
        """重写定时器事件"""
        # 获取当前标签内容
        current_sec = int(self.text())
        current_sec -= 1
        self.setText(str(current_sec))

        if current_sec == 0:
            self.killTimer(self.timer_id)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = QWidget()
    window.setWindowTitle('定时器')
    window.resize(500, 500)

    label = Mylabel(window)
    label.setSec(50)
    label.startMyTimer(1000)
    window.show()
    sys.exit(app.exec_())

1.2.8.3 案例2

创建一个窗口,通过定时器不断增加该窗口的尺寸大小
要求:

  1. 每100ms宽高均增加1px
from PyQt5.Qt import *
import sys


class MyWidget(QWidget):
    def timerEvent(self, *args, **kwargs):
        current_w = self.width()
        current_h = self.height()
        self.resize(current_w + 10, current_h + 10)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWidget()
    window.resize(200, 200)
    window.setWindowTitle('定时器')
    window.startTimer(1000)

    window.show()
    sys.exit(app.exec_())

1.2.9 语言翻译

1.2.9.1 API
  1. tr()
1.2.9.2 应用场景
  1. 多语言国际化支持

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

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

相关文章

C++Primer 变量

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

VScode怎么重启

原文链接:【vscode】vscode重新启动 键盘按下 Ctrl Shift p 打开命令行,如下图: 输入Reload Window,如下图:

(leetcode算法题)382. 链表随机节点

如果给你一个 智能记录 k行内容的小笔记本,从一本你也不知道有多少行的 C Primer 中进行摘抄,你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中? 答:准备好一个公平的轮盘和一个巨大的摇奖机&#xff0c…

MIPI_DPU 综合(DPU+MIPI+Demosaic+VDMA 通路)

目录 1. 简介 2. 创建 Platform 2.1 Block Design 2.1.1 DPU PFM Lite 2.1.2 DPU prj 2.1.3 DPU MIPI Platform 2.2 pin 约束 2.2.1 GPIO 约束 2.2.2 IIC 约束 2.1.3 DPHY 约束 3. 报错总结 3.1 AXI_M 必须顺序引用 3.2 DPU 地址分配错误 4. Design Example 4.…

亚信安全2025年第1期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件51起,本周勒索事件数量降至近一年来最低,需注意防范。从整体上看Ransomhub依旧是影响最严重的勒索家族;本周Acrusmedia和Safepay也是两个活动频繁的恶意家族,需要注意防范。本周&#…

麒麟服务器安装kafka--亲测

我这安装的是单机版本的: 下载地址:Index of /kafka/3.9.0 我下载的是:https://dlcdn.apache.org/zookeeper/zookeeper-3.9.3/apache-zookeeper-3.9.3-bin.tar.gz https://dlcdn.apache.org/kafka/3.9.0/kafka_2.12-3.9.0.tgz 一、下载并上…

利用Deeplearning4j进行 图像识别

目录 图像识别简介 神经网络 感知器 前馈神经网络 自动编码器 受限玻尔兹曼机 深度卷积网络 理解图像内容以及图像含义方面,计算机遇到了很大困难。本章先介绍计算机理解图像教育方面 遇到的难题,接着重点讲解一个基于深度学习的解决方法。我们会…

51单片机——按键实验

由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间的长短由按键的机械特性决定的,一般为 5ms 到 10ms,为了确保 CPU 对按键的…

关于嵌入式系统的知识课堂(二)

成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于嵌入式系统的知识课堂(…

CSS——5. 外部样式

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>方法3&#xff1a;外部样式</title><link rel"stylesheet" href"a.css" /><link rel"stylesheet" href"b.css"/&g…

玩游戏提示找不到vcruntime140.dll,修复方法分享

在玩游戏时&#xff0c;电脑突然弹出“找不到vcruntime140.dll”的提示怎么回事&#xff1f;玩游戏时提示找不到vcruntime140.dll文件时&#xff0c;这通常意味着你的系统中缺少了这个关键的DLL文件&#xff0c;或者该文件已损坏。vcruntime140.dll是Visual C运行时库的一部分&…

Aloudata AIR | 逻辑数据平台的 NoETL 之道

一文为你介绍 Aloudata AIR 逻辑数据平台的技术原理与核心价值 本文主旨是介绍逻辑数据平台的技术原理与核心价值&#xff0c;包含几个部分的内容&#xff1a; 首先&#xff0c;简要阐述逻辑数据平台出现的背景&#xff1b;其次&#xff0c;详细讲解逻辑数据平台的构建方法&am…

电子应用设计方案86:智能 AI背景墙系统设计

智能 AI 背景墙系统设计 一、引言 智能 AI 背景墙系统旨在为用户创造一个动态、个性化且具有交互性的空间装饰体验&#xff0c;通过融合先进的技术和创意设计&#xff0c;提升室内环境的美观度和功能性。 二、系统概述 1. 系统目标 - 提供多种主题和风格的背景墙显示效果&…

12306分流抢票软件 bypass v1.16.43 绿色版(春节自动抢票工具)

软件介绍 12306Bypass分流抢票软件&#xff0c;易操作强大的12306抢票软件&#xff0c;全程自动抢票&#xff0c;云识别验证码打码&#xff0c;多线程秒单、稳定捡漏&#xff0c;支持抢候补票、抢到票自动付款&#xff0c;支持多天、多车次、多席别、多乘客、短信提醒等功能。…

MiFlash 线刷工具下载合集

MiFlash 线刷工具下载合集 MiFlash 线刷工具下载合集 – MIUI历史版本相较于小米助手的刷机功能&#xff0c;线刷还是偏好使用 MiFlash。特点是界面简单纯粹&#xff0c;有自定义高级选项&#xff0c;可以选择刷机不上 BL 锁&#xff0c;自定义刷机脚本&#xff0c;EDL 刷机模…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计&#xff1f; 什么是面向对象的分析和设计&#xff1f; 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计&#xff1f; 分析&#xff0c;强调是对问题和需求的调查研究&#xff0c;不是解决方案。例如&#x…

第五届电网系统与绿色能源国际学术会议(PGSGE 2025)

2025年第五届电网系统与绿色能源国际学术会议(PGSGE 2025) 定于2025年01月10-12日在吉隆坡召开。 第五届电网系统与绿色能源国际学术会议&#xff08;PGSGE 2025&#xff09; 基本信息 会议官网&#xff1a;www.pgsge.org【点击投稿/了解会议详情】 会议时间&#xff1a;202…

Python爬虫 - 豆瓣图书数据爬取、处理与存储

文章目录 前言一、使用版本二、需求分析1. 分析要爬取的内容1.1 分析要爬取的单个图书信息1.2 爬取步骤1.2.1 爬取豆瓣图书标签分类页面1.2.2 爬取分类页面1.2.3 爬取单个图书页面 1.3 内容所在的标签定位 2. 数据用途2.1 基础分析2.2 高级分析 3. 应对反爬机制的策略3.1 使用 …

Java 数据库连接 - Sqlite

Java 数据库连接 - Sqlite PS: 1. 连接依赖库&#xff1a;[sqlite-jdbc-xxx.jar](https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc)(根据连接的数据库版本选择) 2. 支持一次连接执行多次sql语句&#xff1b; 3. 仅本地连接&#xff1b;使用说明&#xff1a; publ…

组网实训实现

小型单元网络实现 IP划分&#xff1a; 外网:172.1.1.0/24 172.1.2.0/24 内网&#xff1a;基于192.168.3.0/24的子网划分 综合办公楼&#xff1a;192.168.3.00 000000 /26&#xff08;192.168.3.0-192.168.3.63&#xff09; 综合一楼&#xff1a;192.168.3.0000 0000 /28&…