pyside6自定义部件库和软件框架的建设记录

自定义的部件库原则上尽量做到前后端分离,接口方便,复制简单。

单选框部件

# encoding: utf-8
###################################################
#               自定义的单选框
#################################################### 对外接口:
# stateNum = Signal(int)  状态号,从1开始,是几就几被选中
# customSetup():   # 定制的初始化程序import PySide6
from PySide6.QtCore import Signal
from PySide6.QtWidgets import QWidget, QGroupBox, QFrameclass PysideCustomRadiobutton(QFrame):stateNum = Signal(int)    # 状态号,从1开始,是几就几被选中def __init__(self, parent=None):super().__init__(parent)self.RadioButtons = []def customSetupUi(self):   # 定制的初始化程序self.RadioButtons = self.findChildren(PySide6.QtWidgets.QRadioButton)   # 部件中所有的单选按钮self.RadioButtons.sort(key=lambda child: child.objectName())    # 按名称排序for i in range(len(self.RadioButtons)):def callback(idx):return lambda: self.stateNum.emit(idx+1)self.RadioButtons[i].clicked.connect(callback(i))     # 单击按钮后发射信号self.stateNum.connect(self.changeState)                   # 状态号信号的连接self.stateNum.emit(1)                                     # 初始化状态下,状态1被选中def changeState(self, thisTurnOn):    # 改变状态self.RadioButtons[thisTurnOn-1].setChecked(True)

前端的范例: 

框架的建立和调用

# 阶段v1的调用
import sys
from time import strftimefrom PySide6.QtCore import QObject, Signal, QTimer
from PySide6.QtWidgets import QWidget, QApplication, QMainWindow
import template_rc  # 导入需要显示的画面# ############导入并需要显示的画面集中在这里定义#############################
# ############template.ui的显示#############################
class MainWindow(QMainWindow, template_rc.Ui_MainWindow):  # 定义需要显示的画面类def __int__(self):super().__init__()# ########################部件初始化的通用函数###################################
def init_widgets(widget):  # 画面里的部件的初始化sons = widget.children()  # 儿辈部件def find_child(child):  # 查找子部件try:child.customSetupUi()  # 自定义的初始化except AttributeError:passif child.children():for grandson in child.children():find_child(grandson)  # 递归查找for son in sons:find_child(son)# #############################主程序###################################
if __name__ == '__main__':app = QApplication(sys.argv)# #######################本项目的定义###################################class UI(QObject):# ##########项目范围内的信号#############sysClock_1S = Signal()  # 秒时钟信号# ##########定时器#############timer_1s = QTimer()  # 定义全局0.1s的周期定时器timer_1s.start(1000)# ###########__init__###############def __init__(self):super().__init__()self.widgets = []  # 所有的视窗列表# ########################本项目的实例化###################################ui = UI()# #######################画面实例化和初始化################################## ########################实例化模板画面#################################mainWindow = MainWindow()mainWindow.setupUi(mainWindow)  # 模板画面的本体初始化init_widgets(mainWindow)  # 模板画面的部件初始化mainWindow.show()ui.widgets.append(mainWindow)  # 将画面加入视窗列表,方便管理# ###########################信号的连接##################################### ###########################项目级别信号的连接###############################ui.timer_1s.timeout.connect(ui.sysClock_1S.emit)ui.sysClock_1S.connect(lambda: mainWindow.labelSystemClock.setText(strftime('%Y-%m-%d %H:%M:%S')))# ###########################mainWindow画面信号的连接######################mainWindow.RadioButtons_1.stateNum.connect(lambda x: mainWindow.label_1.setText(str(x)))mainWindow.pushButton_1.clicked.connect(lambda: mainWindow.RadioButtons_1.stateNum.emit(1))mainWindow.doubleSpinBox_1.valueChanged.connect(lambda x: mainWindow.label_22.setText(str(x)))# ###########################槽函数####################################sys.exit(app.exec())

运行截图:

本阶段的资源链接:(v1)https://download.csdn.net/download/xulibo5828/89120987?spm=1001.2101.3001.9499

自定义功能的仪表盘

        一个具有设定值输入、微调,实时值显示,历史曲线实时显示的仪表盘。

        在CAD软件中大致规划一下功能区的尺寸和排列:

         功能和分工规划:编程阶段可视的部件在QT designer中完成部署和设置,运行阶段可视的动态部件在程序中根据QT designer中的设置值自动计算和部署。

        对外接口:外部传入设定值和实时值。

        画面设计:在QT Designer里面完成画面的组态,布置和复制部件也仅在QT Designer中进行。部件的总容器和历史数据显示窗口用QFrame,进度条和历史曲线的显示在程序里用QPainter实现。历史曲线尝试过用专门的绘图库matplotlib,这个库在嵌入pyside6的部件时无法做到0边距无缝衔接,左右两边无法布满pyside6的部件。如下图:

所以,还是决定用QPainter的 drawline来实现。

在QT Designer里设计好部件的各个组件:

 为之配套编写代码,命名为PysideCustomDashboard.py,并将部件“提升为”这个自定义的类。

 部件的代码:

# encoding: utf-8
###################################################
#               自定义的仪表盘
#################################################### 对外接口:
#   ActualValueInput = Signal(float)  # 从外部传入的实时值
#   customSetup():   # 定制的初始化程序import PySide6
from PySide6.QtCore import Signal, Qt, QPoint
from PySide6.QtGui import QColor, QPen, QPainter
from PySide6.QtWidgets import QFrameclass PysideCustomDashboard(QFrame):ActualValueInput = Signal(float)  # 从外部传入的实时值PresetValueInput = Signal(float)  # 从外部传入的设定值PresetValueOutput = Signal(float)  # 向外部传出的设定值def __init__(self, parent=None):super().__init__(parent)# self.preset_value = 0.0            # 预设值的valueself.processBar_preset_width = 0  # 预设值进度条的宽度self.processBar_preset_radius = 0  # 预设值进度条的半径self.processBar_actual_radius = 0  # 实时值进度条的半径self.processBar_y_start = 0  # 进度条的外轮廓距y方向边缘距离self.processBar_x_start = 0  # 进度条的外轮廓距x方向边缘距离self.center_point = QPoint(0, 0)  # 部件的中心坐标self.actual_text_color = QColor()  # 实时值窗口文字颜色self.spinBox_preset_text_color = QColor()  # 预设值窗口文字颜色self.progressBar_backColor = QColor('#515d80')  # 进度条背景色self.frame_history_Palette = None  # 历史曲线显示窗口的调色板self.frame_history_styleSheet = None  # 历史曲线显示窗口的样式表self.frame_history_geometry = None  # 历史曲线显示窗口的几何特征self.label_name = None  # 仪表盘名称文字框self.label_unit = None  # 显示单位文字框self.label_actual = None  # 实时值的显示文字框self.spinBox_preset = None  # 带微调的设置值输入部件self.frame_history = None  # 历史曲线显示窗口self.begin_degree = 225  # 进度条总的起始角度self.span_degree = -225  # 进度条总的跨度角度self.actual_begin_degree = 225  # 实时值的进度条起始角度self.actual_span_degree = 0  # 实时值的进度条跨度始角度self.preset_begin_degree = 225  # 设定值的进度条起始角度self.preset_span_degree = 0  # 设定值的进度条跨度始角度self.min_value = 0.0  # 最小值self.max_value = 100.0  # 最大值self.processBar_actual_width = 0  # 进度条的宽度self.processBar_center = QPoint(0, 0)  # 进度条的中心self.points = 10  # 显示的点数# #######################定制的初始化程序###########################def customSetupUi(self):  # 定制的初始化程序# ######################子部件的定义############################children = self.children()for child in children:# ##############历史曲线显示窗口#####################if 'frame_history' in child.objectName():self.frame_history_geometry = child.geometry()  # 几何数据self.frame_history_styleSheet = child.styleSheet()  # 样式表self.frame_history_Palette = child.palette()  # 颜色表# #################带微调的设置值输入部件################elif 'spinBox_preset' in child.objectName():self.spinBox_preset = childp = child.palette()  # 颜色表self.spinBox_preset_text_color = p.color(p.ColorRole.Text)  # 获取预设值窗口文字颜色self.min_value = child.minimum()  # 最小值self.max_value = child.maximum()  # 最大值# ###################实时值的显示文字框###################elif 'label_actual' in child.objectName():self.label_actual = childp = child.palette()  # 颜色表self.actual_text_color = p.color(p.ColorRole.Text)  # 获取实时值窗口文字颜色# #################显示单位文字#######################elif 'label_unit' in child.objectName():self.label_unit = child# ##############仪表盘名称文字####################elif 'label_name' in child.objectName():  #self.label_name = child# ##################本体几何参数########################self.center_point = QPoint(int(self.width() / 2), int((self.height() / 2)))  # 中心点坐标# ####################历史曲线显示窗口的定义###################self.frame_history = CustomLineChart(self.spinBox_preset_text_color, self.actual_text_color, self.min_value,self.max_value, self.points, self)  # 实体化历史曲线显示窗口self.frame_history.setGeometry(self.frame_history_geometry)  # 克隆几何尺寸self.frame_history.setStyleSheet(self.frame_history_styleSheet)  # 克隆样式表self.frame_history.setPalette(self.frame_history_Palette)  # 克隆颜色表self.frame_history.show()  # 显示# self.frame_history.customSetupUi()  # 历史曲线显示窗口初始化# ####################进度条的定义##############################self.processBar_actual_width = int((self.width() / 50))  # 实时值进度条的宽度# self.processBar_preset_width = self.processBar_actual_width  # 预设值进度条的宽度self.processBar_preset_width = int(self.processBar_actual_width * 0.66)  # 预设值进度条的宽度# self.processBar_preset_width = int(self.processBar_actual_width / 3)self.processBar_x_start = int(self.width() / 20)  # 进度条的外轮廓距x方向边缘距离self.processBar_y_start = int(self.width() / 20)  # 进度条的外轮廓距y方向边缘距离self.processBar_actual_radius = int((self.width() / 2) - self.processBar_x_start - (self.processBar_actual_width / 2) * 0.9)  # 实时值进度条的半径self.processBar_preset_radius = int(self.processBar_actual_radius - self.processBar_actual_width)  # 预设值进度条的半径self.signal_handing([self.spinBox_preset.value(), 'preset'])  # 初始化一下预设值进度条的显示# ######################信号的连接############################self.ActualValueInput.connect(lambda x: self.signal_handing([x, 'actual']))  # 接收到外部传入实时数据后的信号处理self.PresetValueInput.connect(self.spinBox_preset.setValue)    # 接收到外部传入设置值后的信号处理self.spinBox_preset.valueChanged.connect(lambda x: self.signal_handing([x, 'preset']))  # 设置值发生改变后的信号处理# #######################发射信号的处理############################def signal_handing(self, args):if args[1] == 'actual':  # 如果是实时值发射的信号self.frame_history.PointValues.emit(self.spinBox_preset.value(), args[0])  # 将预设值和实际值打包发送到历史曲线的部件的输入信号self.label_actual.setText(str(args[0]))  # 实时显示实际值的数字self.actual_span_degree = int((args[0] - self.min_value) / (self.max_value - self.min_value) * self.span_degree)  # 计算实时值进度条的角度self.update()  # 刷新画面else:  # 如果是设定值发射的信号self.frame_history.PointValues.emit(self.spinBox_preset.value(),float(self.label_actual.text()))  # 将预设值和实际值打包发送到历史曲线的部件的输入信号self.preset_span_degree = int((args[0] - self.min_value) / (self.max_value - self.min_value) * self.span_degree)  # 计算设定值进度条的角度self.update()  # 刷新画面# ########################绘制进度条圆弧###########################def draw_arc(self, color, center, startAngle, spanAngle, width, radius):painter = QPainter(self)  # 设定画板painter.setRenderHint(QPainter.Antialiasing)  # 抗锯齿painter.setPen(QPen(color, width, Qt.SolidLine))  # 设置画笔颜色、粗细和线型painter.drawArc(center[0] - radius, center[1] - radius, radius * 2, radius * 2, startAngle * 16, spanAngle * 16)# #########################重写paintEvent########################def paintEvent(self, event):# ##################绘制实时值背景进度条###############################self.draw_arc(self.progressBar_backColor, (self.center_point.x(), self.center_point.y()), self.begin_degree,self.span_degree, self.processBar_actual_width, self.processBar_actual_radius)# ##################绘制设置值背景进度条###############################self.draw_arc(self.progressBar_backColor, (self.center_point.x(), self.center_point.y()), self.begin_degree,self.span_degree, self.processBar_preset_width, self.processBar_preset_radius)# ##################绘制实时值的显示进度条###############################self.draw_arc(self.actual_text_color, (self.center_point.x(), self.center_point.y()), self.actual_begin_degree,self.actual_span_degree, self.processBar_actual_width, self.processBar_actual_radius)# ##################绘制设置值的显示进度条###############################self.draw_arc(self.spinBox_preset_text_color, (self.center_point.x(), self.center_point.y()),self.preset_begin_degree,self.preset_span_degree, self.processBar_preset_width, self.processBar_preset_radius)# #########################历史曲线显示窗口的class定义########################
class CustomLineChart(QFrame):  # 自定义的折线表PointValues = Signal(float, float)  # 点值,设置值在前,实时值在后def __init__(self, preset_color, actual_color, min_value, max_value, points, parent=None):super().__init__(parent)self.points = points  # 显示的点数self.preset_value_points = [0.0]  # 设置值的数据点集self.actual_value_points = [0.0]  # 实时值的数据点集self.overflow = False  # 数据超量程self.background_color = QColor()  # 背景色self.preset_color = preset_color  # 预置值颜色self.actual_color = actual_color  # 实时值颜色self.preset_pen = QPen()  # 预设值波形的画笔self.actual_pen = QPen()  # 实时值波形的画笔self.min_value = min_value  # 最小值self.max_value = max_value  # 最大值self.x_points = []  # X轴的分度self.x_step = 0  # X轴的步调节拍def customSetupUi(self):  # 定制的初始化程序# #####################建立x轴的分度表############################x = 0s = self.width() / (self.points - 1)for i in range(self.points):self.x_points.append(int(x))x += s# #####################初始化颜色特征############################p = self.palette()  # 获取调色板self.background_color = p.color(p.ColorRole.Window)  # 获取背景色self.preset_pen = QPen(self.preset_color, 1)  # 预置值的笔self.actual_pen = QPen(self.actual_color, 1)  # 实时值的笔# #####################信号的连接############################self.PointValues.connect(self.pretreat)  # 当传入值以后预处理数据self.PointValues.connect(self.update)  # 当传入值以后更新画面def pretreat(self, preset_value, actual_value):  # 数据的预处理# #####################预设值数据的预处理############################k = (preset_value - self.min_value) / (self.max_value - self.min_value)v = int(self.height() * (1 - k))self.preset_value_points.append(v)if len(self.preset_value_points) > self.points:del self.preset_value_points[0]# #####################实时值数据的预处理############################if actual_value < self.min_value:  # 输入值超出量程actual_value = self.min_valueself.overflow = Trueelif actual_value > self.max_value:actual_value = self.max_valueself.overflow = Trueelse:self.overflow = Falsek = (actual_value - self.min_value) / (self.max_value - self.min_value)  # 显示比例转换v = int(self.height() * (1 - k))self.actual_value_points.append(v)if len(self.actual_value_points) > self.points:del self.actual_value_points[0]# ############################绘图事件####################################def paintEvent(self, event):  # 重新定义paintEventpainter = QPainter(self)  # 设定画板painter.setPen(Qt.NoPen)  # 设定画笔# #########################重画背景###################################if self.overflow:color = QColor('#363636')else:color = self.background_colorpainter.setBrush(color)  # 设置笔刷painter.drawRect(0, 0, self.width(), self.height())  # 重画背景# #########################绘制预设值的折线#############################pen = QPen(self.preset_color)pen.setWidth(1)painter.setPen(pen)if len(self.preset_value_points) > 1:i = 1while i < len(self.preset_value_points):painter.drawLine(self.x_points[i - 1], int(self.preset_value_points[i - 1]), self.x_points[i],int(self.preset_value_points[i]))i += 1# #########################绘制实时值的折线#############################pen = QPen(self.actual_color)pen.setWidth(1)painter.setPen(pen)if len(self.actual_value_points) > 1:i = 1while i < len(self.actual_value_points):                painter.drawLine(self.x_points[i - 1], int(self.actual_value_points[i - 1]),self.x_points[i], int(self.actual_value_points[i]))i += 1

 编写调用程序:基本的调用框架.py

# 阶段v1的调用
import random
import sys
from time import strftimefrom PySide6.QtCore import QObject, Signal, QTimer
from PySide6.QtWidgets import QApplication, QMainWindowimport template_rc  # 导入需要显示的画面
import 按钮图标_rc# ############导入并需要显示的画面集中在这里定义#############################
# ############template.ui的显示#############################
class MainWindow(QMainWindow, template_rc.Ui_MainWindow):  # 定义需要显示的画面类def __int__(self):super().__init__()# ########################部件初始化的通用函数###################################
def init_widgets(widget):  # 画面里的部件的初始化sons = widget.children()  # 儿辈部件def find_child(child):  # 查找子部件try:child.customSetupUi()  # 自定义的初始化except AttributeError:passif child.children():for grandson in child.children():find_child(grandson)  # 递归查找for son in sons:find_child(son)def test():  # 测试程序n1 = random.randint(-300, 300)window1.dashboard_1.ActualValueInput.emit(float(n1 / 100.0 + 80))# #############################主程序###################################
if __name__ == '__main__':app = QApplication(sys.argv)# #######################项目级别的定义###################################class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量# ##########项目范围内的信号#############sysClock_1S = Signal()  # 秒时钟信号# ##########定时器#############timer_1s = QTimer()  # 定义全局0.1s的周期定时器timer_1s.start(300)# ###########__init__###############def __init__(self):super().__init__()self.widgets = []  # 所有的视窗列表# ########################本项目的实例化###################################ui = UI()# #######################画面实例化和初始化################################## ########################实例化模板画面#################################window1 = MainWindow()window1.setupUi(window1)  # 模板画面的本体初始化window1.show()  # 显示画面ui.widgets.append(window1)  # 将画面加入视窗列表,方便管理# ###########################信号的连接##################################### # ###########################项目级别信号的连接###############################ui.timer_1s.timeout.connect(ui.sysClock_1S.emit)ui.timer_1s.timeout.connect(test)ui.sysClock_1S.connect(lambda: window1.labelSystemClock.setText(strftime('%Y-%m-%d %H:%M:%S')))# ###########################Window1画面信号的连接####################### ###########################槽函数####################################init_widgets(window1)  # 画面的子部件初始化sys.exit(app.exec())

运行截图:

 

进一步的,在组态画面里按ctrl拖动复制一份 ,并改变一些几何和颜色特征,增加一个外部设定部件:

编写调用程序:仪表盘调用demo.py 

# 阶段v1的调用
import random
import sys
from time import strftime
from PySide6.QtCore import QObject, Signal, QTimer
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel, QDoubleSpinBoximport template_rc  # 导入需要显示的画面
import 按钮图标_rc# ############导入并需要显示的画面集中在这里定义#############################
# ############template.ui的显示#############################
class MainWindow(QMainWindow, template_rc.Ui_MainWindow):  # 定义需要显示的画面类def __int__(self):super().__init__()# ########################部件初始化的通用函数###################################
def init_widgets(widget):  # 画面里的部件的初始化sons = widget.children()  # 儿辈部件def find_child(child):  # 查找子部件try:child.customSetupUi()  # 自定义的初始化except AttributeError:passif child.children():for grandson in child.children():find_child(grandson)  # 递归查找for son in sons:find_child(son)def test():  # 测试程序n1 = random.randint(-300, 300)n2 = random.randint(-300, 300)window1.dashboard_1.ActualValueInput.emit(float(n1 / 100.0 + 80))window1.dashboard_2.ActualValueInput.emit(float(n2 / 100.0 + 150))# #############################主程序###################################
if __name__ == '__main__':app = QApplication(sys.argv)# #######################项目级别的定义###################################class UI(QObject):  # 将项目定义为QObject,用来管理项目级别的信号和变量# ##########项目范围内的信号#############sysClock_1S = Signal()  # 秒时钟信号# ##########定时器#############timer_1s = QTimer()  # 定义全局0.1s的周期定时器timer_1s.start(1000)# ###########__init__###############def __init__(self):super().__init__()self.widgets = []  # 所有的视窗列表# ########################本项目的实例化###################################ui = UI()# #######################画面实例化和初始化################################## ########################实例化模板画面#################################window1 = MainWindow()window1.setupUi(window1)  # 模板画面的本体初始化window1.show()  # 显示画面ui.widgets.append(window1)  # 将画面加入视窗列表,方便管理# ###########################信号的连接##################################### # ###########################项目级别信号的连接###############################ui.timer_1s.timeout.connect(ui.sysClock_1S.emit)ui.timer_1s.timeout.connect(test)ui.sysClock_1S.connect(lambda: window1.labelSystemClock.setText(strftime('%Y-%m-%d %H:%M:%S')))# ###########################Window1画面信号的连接######################window1.doubleSpinBox.valueChanged.connect(window1.dashboard_1.PresetValueInput.emit)# ###########################槽函数####################################init_widgets(window1)  # 画面的子部件初始化# QLabel# QDoubleSpinBoxsys.exit(app.exec())

 运行截图:

基本实现了设计初衷 ,前后端图像和代码分离,接口和调用简单,复制部署方便。

 资源链接:(本阶段为v2)https://download.csdn.net/download/xulibo5828/89148225?spm=1001.2101.3001.9499 

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

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

相关文章

蓝桥杯2024年第十五届省赛真题-R 格式(高精度乘法 + 加法)

本题链接&#xff1a;蓝桥杯2024年第十五届省赛真题-R 格式 - C语言网 题目&#xff1a;​​​​​​​ 样例&#xff1a; 输入 2 3.14 输出 13 思路&#xff1a; 根据题意&#xff0c;结合数据范围&#xff0c;这是一道模板的高精度乘以低精度问题。 题意是double 类型 d 与…

【C++】类和对象③(类的默认成员函数:拷贝构造函数 | 赋值运算符重载)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 拷贝构造函数 概念 拷贝构造函数的特性及用法 赋值运算符重载 运算符重载 赋值运算符重载 结语 前言 本篇主要内容&#xff1a;类的6个默认成员函数中的拷贝构造函数…

由于找不到krpt.dll,无法继续执行代码的5种解决方法

在正常使用电脑的过程中&#xff0c;当尝试启动某个应用程序或者执行特定功能时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出由于缺失关键性文件——krpt.dll&#xff0c;导致当前运行的软件无法正常读取并执行相应的程序代码&#xff0c;进而无法顺利完成预…

Neo4j 图形数据库中有哪些构建块?

Neo4j 图形数据库具有以下构建块 - 节点属性关系标签数据浏览器 节点 节点是 Graph 的基本单位。 它包含具有键值对的属性&#xff0c;如下图所示。 NEmployee 节点 在这里&#xff0c;节点 Name "Employee" &#xff0c;它包含一组属性作为键值对。 属性 属性是…

Hit the World Hit世界 Hit2日服官网地址+配置要求+测试时间

Hit the World/Hit世界/Hit2日服官网地址配置要求测试时间 Hit the World/Hit世界是NEXON旗下MMOROG游戏&#xff0c;作品类型上是典型的类天堂游戏&#xff0c;升级思路很简单&#xff0c;一般是跟着主线走&#xff0c;除了主线还有副本升级。支持移动和PC两端&#xff0c;继…

1113. 红与黑--Flood Fill 算法

目录 1113. 红与黑--Flood Fill 算法---宽搜&#xff08;BFS&#xff09;或DFS&#xff09; 输入格式 输出格式 数据范围 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 1.BFS 思路&#xff1a; 2.DFS 思路 方法一&#xff1a;&#xff08;BFS&#x…

STM32H7的8个串口fifo收发(兼容232和485)

STM32H7的8个串口fifo收发&#xff08;兼容232和485&#xff09; 串口硬件串口时序串口高级特性同步和异步的区别单工、半双工、全双工的区别 STM32H78个串口fifo驱动定义数据结构uart_fifo.huart驱动包括中断配置等 应用示例RS485深入理解 仅供学习。 USART 的全称是 Universa…

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

sqlilabs靶场1—20题学习笔记(思路+解析+方法)

前几个题目较为简单&#xff0c;均尝试使用各种方法进行SQL注入 第一题 联合查询 1&#xff09;思路&#xff1a; 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限&#xff0c;爆库&#xff0c;爆版本号 爆表&#xff0c;爆列&…

全球顶级的低代码开发平台,你知道几个?

什么是低代码开发平台? 低码开发平台是一个应用程序,提供图形用户界面编程,从而以非常快的速度开发代码,减少了传统的编程工作。 这些工具有助于快速开发代码,最大限度地减少手工编码的努力。这些平台不仅有助于编码,而且还能快速安装和部署。 低码开发工具的好处 低代码平…

3dmax在线渲染怎么取消?怎么关闭云渲染

在线渲染&#xff0c;无论是通过云渲染服务还是渲染农场&#xff0c;已经成为众多3dmax动画制作者的首选方式来执行渲染任务。然而&#xff0c;如果在渲染过程中需要禁用这一在线渲染功能&#xff0c;该怎么操作呢&#xff1f;接下来&#xff0c;让我们一起探讨如何关闭这一功能…

【精读文献】Scientific data|2017-2021年中国10米玉米农田变化制图

论文名称&#xff1a;Mapping annual 10-m maize cropland changes in China during 2017–2021 第一作者及通讯作者&#xff1a;Xingang Li, Ying Qu 第一作者单位及通讯作者单位&#xff1a;北京师范大学地理学部 文章发表期刊&#xff1a;《Scientific data》&#xff08…

书生浦语学习第二课 轻松玩转书生浦语趣味Demo

本节课让同学们实践 4 个内容&#xff0c;分别是&#xff1a;部署 InternLM2-Chat-1.8B 模型进行智能对话、部署一期实战营优秀作品 八戒-Chat-1.8B 模型、 运行 Lagent 智能体 Demo、实践部署 浦语灵笔2 模型。 第一步&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Check Box的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 按钮类控件Check Box的使用及说明 文章编号&#xff1a;…

CSS实现卡片在鼠标悬停时突出效果

在CSS中&#xff0c;实现卡片在鼠标悬停时突出&#xff0c;通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时&#xff0c;该元素的状态变化。通过:hover选择器&#xff0c;你可以定义鼠标悬停在元素上时元素的样式&#xff0c;比如改变颜色、…

基于Docker构建CI/CD工具链(七)使用Jmeter进行自动化压测

上一篇文章中&#xff0c;我们详细介绍了构建 Apifox Cli 的 Docker 镜像的步骤&#xff0c;并通过简单的示例演示了如何利用 GitLab 的 CI/CD 功能&#xff0c;将构建好的镜像利用在自动化测试作业中。在今天的文章中&#xff0c;我们将重点讨论如何构建 JMeter 的 Docker 镜像…

【Entity Framework】你知道如何处理无键实体吗

【Entity Framework】你知道如何处理无键实体吗 文章目录 【Entity Framework】你知道如何处理无键实体吗一、概述二、定义无键实体类型数据注释 三、无键实体类型特征四、无键实体使用场景五、无键实体使用场景六、无键使用示例6.1 定义一个简单的Blog和Post模型&#xff1a;6…

csdn 博客怎么设置背景图

一、效果图 话不多说&#xff0c;先看效果图&#xff1a; 二、操作步骤 点击创作中心&#xff1a; 点击博客设置&#xff1a; 编辑博客设置&#xff1a; 点击保存&#xff1a; 三、自定义背景图 csdn不支持自定义背景图&#xff0c;只支持选择背景主题。 四、其它

大模型日报|今日必读的10篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.谷歌推出新型 Transformer 架构&#xff1a;反馈注意力就是工作记忆 虽然 Transformer 给深度学习带来了革命性的变化&#xff0c;但二次注意复杂性阻碍了其处理无限长输入的能力。 谷歌研究团队提出了一种新型 T…

【vue】Pinia-2 安装Pinia,使用store

1. 安装Pinia 在项目路径下执行npm install pinia 在package.json中查看 2. 使用store 在main.js中添加 import { createPinia } from pinia const pinia createPinia()修改createApp方法 最后示例如下&#xff08;三处修改&#xff09; import { createApp } from vue //…