信号与槽的高级玩法

高级自定义信号与槽

所谓高级自定义信号与槽,指的是我们可以以自己喜欢的方式定义信号与槽函
数,并传递参数。自定义信号的一般流程如下:
(1)定义信号。
(2)定义槽函数。
(3)连接信号与槽函数。
(4)发射信号。

定义信号

通过类成员变量定义信号对象。

class MyWidget(QWidget):# 无参数的信号Signal_NoParameters=pyqtSignal()#带一个参数(整数)的信号Singal_OneParameter=pyqtSignal(int)#带一个参数(整数或者字符串)的重载版本的信号Singal_OneParameter_Overload=pyqtSignal([int],[str])#带两个参数(整数,字符串)的信号Signal_TwoParameters=pyqtSignal(int,str)#带两个参数([整数,整数])或者[整数,字符串])的重载版本的信号Signal_TwoParameter_Overlaod=pyqtSignal([int,int],[int,str])

定义槽函数

定义一个槽函数,它有多个不同的输入参数。

class MyWidget(QWidget):def setValue_NoParameters(self):'''无参数的槽函数'''passdef setValue_OneParameter(self,nIndex):'''带一个参数(整数)的槽函数'''passdef setValue_OneParameter_String(self,szIndex):'''带一个参数(字符串)的槽函数'''passdef setValue_TwoParameters(self,x,y):'''带两个参数(整数,整数)的槽函数'''passdef setValue_TwoParameters_String(self,x,szy):'''带两参数(整数,字符串)槽函数'''pass

连接信号与槽函数

通过方法连接信号与槽函数或者可调用对象。

app=QApplication(sys.argv)
widget=MyWidget()
#连接无参数的信号
widget.Signal_NoParameters.connect(self.setValue_NoParameters)#连接带一个整数参数的信号
widget.Signal_OneParameter.connect(self.setValue_OneParameter)#连接带一个整数参数,经过重载的信号
widget.Signal_OneParameter_Overload[int].connect(self.setValue_OneParameter_Overload)#连接带一个整数参数,经过重载信号
widget.Signal_OneParameter_Overload[str].connect(self.setValue_OneParameter_strng)#连接带两个参数(整数,整数)的重载版本的信号
widget.Signal_TwoParameters_Overload[int,int].connect(self.setVValue_TwoParameters_Overload)#连接带两个参数(整数,字符串)的重载版本的信号
widget.Signal_TwoParameters_Overload[int,str].connect(self.setValue_TwoParameters_String)
widget.show()

发射信号

通过emit方法发射信号,

class MyWidget(QWidget):def mousePressEvent(self,event):#发射无参数的信号self.Signal_NoParameters.emit()#发射带一个参数(整数)的参数self.Singal_OneParameters.emit(1)# 发射带一个参数(整数)的重载版本的信号self.Sinal_OneParameter_Overload.emit(1)# 发射带一个参数(字符串)的重载版本的信号self.Signal_OneParameter_Overlaod.emit("abc")# 发射带两个参数(整数,字符串)的信号self.Signal_TwoParameters.emit(1,"abc")# 发射带两个参数(整数,整数)的重载版本的信号self.Signal_TwoParameters_Overload.emit(1,2)# 发射带两个参数(整数,字符串)的重载版本的信号self.Signal_TwoParameters_Overload.emit(1,"abc")

实例

import sys
from PyQt5.QtWidgets import QWidget,QPushButton,QApplication
class winform(QWidget):def __init__(self):super(winform,self).__init__()self.setGeometry(200,300,350,50)self.setWindowTitle("内置信号,自定义槽的例子")self.btn=QPushButton("按钮文本",self)self.btn.clicked.connect(self.changeBtnText)def changeBtnText(self):self.btn.setText("按钮内容和宽度改变了")self.btn.setStyleSheet("QPushButton{max-width:200px;min-width:200px}")if __name__ == '__main__':app = QApplication(sys.argv)qb=winform()qb.show()sys.exit(app.exec_())

运行结果

VeryCapture_20250608224009

使用自定义参数

在编程过程中,经常会遇到给槽函数传递自定义参数的情况,比如有一个
信号与槽函数的连接是

button1.clicked.connect(show_page)

我们知道对于clicked信号来说,它是没有参数的:对于show-page函数来说,
希望它可以接收参数。希望show-page函数像如下这样:

def show_page(self,name):print(name,"   点击啦")

于是就产生一个问题一一信号发出的参数个数为0,槽函数接收的参数个数为
1,由于0<1,这样运行起来一定会报错(原因是信号发出的参数个数一定要大于槽
函数接收的参数个数)。解决这个问题就是本节的重点:自定义参数的传递。

from PyQt5.QtWidgets import QMainWindow, QPushButton, QWidget, QMessageBox, QApplication, QHBoxLayout
import sysclass WinForm(QMainWindow):def __init__(self,parent=None):super(WinForm,self).__init__(parent)self.setWindowTitle("信号和槽传递额外参数例子")button1=QPushButton('Button1')button2=QPushButton('Button2')button1.clicked.connect(lambda:self.onButtonClick(1))button2.clicked.connect(lambda:self.onButtonClick(2))layout=QHBoxLayout()layout.addWidget(button1)layout.addWidget(button2)main_frame=QWidget()main_frame.setLayout(layout)self.setCentralWidget(main_frame)def onButtonClick(self,n):print('Button {0} 被按下了'.format(n))QMessageBox.information(self,"信息提示框",'Button {0} clicked'.format((n)))if __name__ == '__main__':app = QApplication(sys.argv)win=WinForm()win.show()sys.exit(app.exec_())

运行结果

VeryCapture_20250608225913

装饰器信号与槽

所谓装饰器信号与槽,就是通过装饰器的方法来定义信号和槽函数。具体的使
用方法如下:

@PyQt5.QtCore.pyqtSlot(参数)
def on_发送者对象名称_发射信号名称(self,参数):pass

这种方法有效的前提是下面的函数已经执行:

QMetaObject.connectSlotsByName(QObject)

在上面代码中,“发送者对象名称”就是使用setObjectName函数设置的名称,
因此自定义槽函数的命名规则也可以看成:on+使用setObjectName设置的名称+
信号名称。接下来看具体的使用方法。

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QPushButton
import sysclass CustWidget(QWidget):def __init__(self,parent=None):super(CustWidget,self).__init__(parent)self.okButton=QPushButton("OK",self)#使用setObectName设置对象名称self.okButton.setObjectName("okButton")layout=QHBoxLayout()layout.addWidget(self.okButton)self.setLayout(layout)QtCore.QMetaObject.connectSlotsByName(self)@QtCore.pyqtSlot()def on_okButton_clicked(self):print("点击了Ok按钮")if __name__ == "__main__":app = QApplication(sys.argv)win=CustWidget()win.show()sys.exit(app.exec_())

运行效果

VeryCapture_20250608234226

from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication,QWidget,QHBoxLayout,QPushButton
import sysclass CustWidget(QWidget):def __init__(self,parent=None):super(CustWidget,self).__init__(parent)self.okButton=QPushButton("OK",self)#使用setObjectName设置对象名称self.okButton.setObjectName("okButton")layout=QHBoxLayout()layout.addWidget(self.okButton)self.setLayout(layout)QtCore.QMetaObject.connectSlotsByName(self)self.okButton.clicked.connect(self.okButton_clicked)def okButton_clicked(self):print("点击了OK按钮")if __name__ == '__main__':app = QApplication(sys.argv)win=CustWidget()win.show()sys.exit(app.exec_())

运行效果同上。

信号与槽的断开和连接

# -*- coding: utf-8 -*-"""【简介】信号槽N对N连接、断开连接示例"""from PyQt5.QtCore import QObject, pyqtSignalclass SignalClass(QObject):# 声明一个无参数的信号signal1 = pyqtSignal()# 声明带一个int类型参数的信号signal2 = pyqtSignal(int)def __init__(self, parent=None):super(SignalClass, self).__init__(parent)# 信号sin1连接到sin1Call和sin2Call这两个槽self.signal1.connect(self.sin1Call)self.signal1.connect(self.sin2Call)# 信号sin2连接到信号sin1self.signal2.connect(self.signal1)# 信号发射self.signal1.emit()self.signal2.emit(1)# 断开sin1、sin2信号与各槽的连接self.signal1.disconnect(self.sin1Call)self.signal1.disconnect(self.sin2Call)self.signal2.disconnect(self.signal1)# 信号sin1和sin2连接同一个槽sin1Callself.signal1.connect(self.sin1Call)self.signal2.connect(self.sin1Call)# 信号再次发射self.signal1.emit()self.signal2.emit(1)def sin1Call(self):print("signal-1 emit")def sin2Call(self):print("signal-2 emit")if __name__ == '__main__':signal = SignalClass()

QtDesigner神助攻:界面显示与业务逻辑的分离

前面给出的是手工输入代码的信号与槽的使用方法,因为采用这种方式介绍时
会更简单一些。如果采用Qt来介绍这些内容,那么任何一个简单的功能都
需要使用xxx.ui、xxx.PY、CalLxxx.py三个文件来实现,这样做内容会显得很乱。

在实战应用中,由于QtDesigner可以更好地实现界面显示与业务逻辑的分离,
所以能帮助我们解决大量的代码。如果能够使用QtDesigner自动创建一些信号与槽
机制,那就更好了。本节将通过一个实战性案例来介绍信号与槽是如何和QtDesigner
结合的。

本例要实现的功能是:通过一个模拟打印的界面来详细说明信号的使用,在打
印时可以设置打印的份数、纸张类型,触发“打印”按钮后,将执行结果显示在右
侧;通过QCheckBox(“全屏预览”复选框)来选择是否通过全屏模式进行预览,
将执行结果显示在右侧。

这里对窗口中的控件进行简要说明,如表7-1所示。

控件类型空间名称作用
QSpinBoxnumberSpinBox显示打印的份数
QComboBoxstyleCombo显示打印的纸张类型。纸张类型包括A3,A4和A5纸
QPushButtonprintButton连按emitPrintSignal函数的绑定,触发自定义信号printSignal的发射
QCheckBoxpreviewStatus是否全屏预览
QPushButtonpreviewButton连接emitPreviewSignal函数的绑定:触发自定义信号previewSignal的发射
QLabelresultLabel显示执行结果
from PyQt5.QtWidgets import QMainWindow,QHBoxLayout,QPushButton,QApplication,QWidget
import sysclass Winform(QMainWindow):def __init__(self,parent=None):super(Winform,self).__init__(parent)self.setWindowTitle('控件中的信号槽通信')self.button1=QPushButton('Button1')self.button1.clicked.connect(self.onButtonClick)layout = QHBoxLayout()layout.addWidget(self.button1)main_frame=QWidget()main_frame.setLayout(layout)self.setCentralWidget(main_frame)def onButtonClick(self):#sender 是发送信号的对象sender=self.sender()print(sender.text()+'  被按下了')if __name__ == '__main__':app=QApplication(sys.argv)form=Winform()form.show()sys.exit(app.exec_())

运行结果

VeryCapture_20250610233807

from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(715, 225)self.controlsGroup = QtWidgets.QGroupBox(Form)self.controlsGroup.setGeometry(QtCore.QRect(10, 20, 451, 151))self.controlsGroup.setObjectName("controlsGroup")self.widget = QtWidgets.QWidget(self.controlsGroup)self.widget.setGeometry(QtCore.QRect(10, 40, 411, 30))self.widget.setObjectName("widget")self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)self.horizontalLayout.setContentsMargins(0, 0, 0, 0)self.horizontalLayout.setObjectName("horizontalLayout")self.label = QtWidgets.QLabel(self.widget)self.label.setObjectName("label")self.horizontalLayout.addWidget(self.label)self.numberSpinBox = QtWidgets.QSpinBox(self.widget)self.numberSpinBox.setObjectName("numberSpinBox")self.horizontalLayout.addWidget(self.numberSpinBox)self.styleCombo = QtWidgets.QComboBox(self.widget)self.styleCombo.setObjectName("styleCombo")self.styleCombo.addItem("")self.styleCombo.addItem("")self.styleCombo.addItem("")self.horizontalLayout.addWidget(self.styleCombo)self.label_2 = QtWidgets.QLabel(self.widget)self.label_2.setObjectName("label_2")self.horizontalLayout.addWidget(self.label_2)self.printButton = QtWidgets.QPushButton(self.widget)self.printButton.setObjectName("printButton")self.horizontalLayout.addWidget(self.printButton)self.widget1 = QtWidgets.QWidget(self.controlsGroup)self.widget1.setGeometry(QtCore.QRect(10, 100, 201, 30))self.widget1.setObjectName("widget1")self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.widget1)self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)self.horizontalLayout_2.setObjectName("horizontalLayout_2")self.previewStatus = QtWidgets.QCheckBox(self.widget1)self.previewStatus.setObjectName("previewStatus")self.horizontalLayout_2.addWidget(self.previewStatus)self.previewButton = QtWidgets.QPushButton(self.widget1)self.previewButton.setObjectName("previewButton")self.horizontalLayout_2.addWidget(self.previewButton)self.resultGroup = QtWidgets.QGroupBox(Form)self.resultGroup.setGeometry(QtCore.QRect(470, 20, 231, 151))self.resultGroup.setObjectName("resultGroup")self.resultLabel = QtWidgets.QLabel(self.resultGroup)self.resultLabel.setGeometry(QtCore.QRect(20, 30, 191, 101))self.resultLabel.setObjectName("resultLabel")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "打印控件"))self.controlsGroup.setTitle(_translate("Form", "打印控制"))self.label.setText(_translate("Form", "打印份数:"))self.styleCombo.setItemText(0, _translate("Form", "A3"))self.styleCombo.setItemText(1, _translate("Form", "A4"))self.styleCombo.setItemText(2, _translate("Form", "A5"))self.label_2.setText(_translate("Form", "纸张类型:"))self.printButton.setText(_translate("Form", "打印"))self.previewStatus.setText(_translate("Form", "全屏预览"))self.previewButton.setText(_translate("Form", "预览"))self.resultGroup.setTitle(_translate("Form", "操作结果"))self.resultLabel.setText(_translate("Form", "<html><head/><body><p><br/></p></body></html>"))
import sys
from PyQt5.QtWidgets import QApplication,QMainWindow
from MainWinSignalSlog02 import Ui_Form
from PyQt5.QtCore import pyqtSignal,Qtclass MyMainWindow(QMainWindow,Ui_Form):helpSignal=pyqtSignal(str)printSignal=pyqtSignal(str)#声明一个多重载版本的信号,包括了一个带int和str类型参数的信号,以及带str参数previewSignal=pyqtSignal([int,str],[str])def __init__(self,parent=None):super(MyMainWindow,self).__init__(parent)self.setupUi(self)self.initUI()def initUI(self):self.helpSignal.connect(self.showHelpMessage)self.printSignal.connect(self.printPaper)self.previewSignal[str].connect(self.previewPaper)self.previewSignal[int,str].connect(self.previewPaperWithArgs)self.printButton.clicked.connect(self.emitPrintSignal)self.previewButton.clicked.connect(self.emitPreviewSignal)#发射预览信号def emitPreviewSignal(self):if self.previewStatus.isChecked()==True:self.previewSignal[int,str].emit(1000,"Full Screen")elif self.previewStatus.isChecked()==False:self.previewSignal[str].emit("Preview")#发射打印信号def emitPrintSignal(self):pList=[]pList.append(self.numberSpinBox.value())pList.append(self.styleCombo.currentText())self.previewSignal.emit(pList)def printPaper(self,list):self.resultLabel.setText("打印:"+"份数:"+str(list[0])+"纸张:"+str(list[1]))def previewPaperWithArgs(self,style,text):self.resultLabel.setText(str(style)+text)def previewPaper(self,text):self.resultLabe.setText(text)#重载点击键盘事件def keyPressEvent(self, event):if event.key()==Qt.Key_F1:self.helpSignal.emit("help message")#显示帮助消息def showHelpMessage(self,message):self.resultLabel.setText(message)self.statusBar().showMessage(message)if __name__ == "__main__":app = QApplication(sys.argv)win=MyMainWindow()win.show()sys.exit(app.exec_())

运行结果

image

注意
(1)自定义信号在__init__()函数之前定义。
(2)自定义信号可以传递如str、int、list、object、float、tuple、、dict等很多类
型的参数。
(3)注意signal和slot的调用逻辑,避免signal和slot之间出现死循环,比
如在slot方法中继续发射该信号。

多线程中信号与槽的使用

from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtCore import QThread,pyqtSignal
import sysclass Main(QWidget):def __init__(self):super(Main,self).__init__()#创建一个线程实例并设置名称、变量、信号槽self.thread=MyThread()self.thread.setIdentity("thread1")self.thread.sinOut.connect(self.outText)self.thread.setVal(6)def outText(self,text):print(text)class MyThread(QThread):sinOut=pyqtSignal(str)def __init__(self,parent=None):super(MyThread,self).__init__(parent)self.identity=Nonedef setIdentity(self,text):self.identity=textdef setVal(self,val):self.times=int(val)#执行线程的run方法self.start()def run(self):while self.times>0 and self.identity:#发射信号self.sinOut.emit(self.identity+"==>"+str(self.times))self.times-=1if __name__ == '__main__':app = QApplication(sys.argv)win=Main()win.show()sys.exit(app.exec_())

运行结果:

thread1==>5
thread1==>4
thread1==>3
thread1==>2
thread1==>1

有时在开发程序时经常会执行一些耗时的操作,这样就会导致界面卡顿,这也
是多线程的应用范围之一一一为了解决这个问题,我们可以创建多线程,使用主线
程更新界面,使用子线程实时处理数据,最后将结果显示到界面上。

本例中,定义了一个后台线程类BackendThread来模拟后台耗时操作,在这个
线程类中定义了信号update_date。使用BackendThread线程类在后台处理数据,每
秒发射一次自定义信号update_date。

在初始化窗口界面时,定义后台线程类BackendThread,并把线程类的信号
updatedate连接到槽函数handleDisplay()。这样后台线程每发射一次信号,就可以
把最新的时间值实时显示在前台窗口的QLineEdit文本对话框中。

from PyQt5.QtCore import QThread,pyqtSignal,QDateTime
from PyQt5.QtWidgets import QApplication,QDialog,QLineEdit
import time
import sysclass BackendThread(QThread):#通过类成员对象定义信号对象update_date=pyqtSignal(str)#处理要做的业务逻辑def run(self):while True:data=QDateTime.currentDateTime()currTime=data.toString("yyyy-MM-dd hh:mm:ss")self.update_date.emit(str(currTime))time.sleep(1)class Window(QDialog):def __init__(self):QDialog.__init__(self)self.setWindowTitle('pyqt5界面实时更新例子')self.resize(400,100)self.input=QLineEdit(self)self.input.resize(400,100)self.initUI()def initUI(self):#创建线程self.backend=BackendThread()#连接信号self.backend.update_date.connect(self.handleDisplay)# 开始线程self.backend.start()#将当前时间输出到文本框def handleDisplay(self,data):self.input.setText(data)if __name__=='__main__':app = QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())

运行结果

image

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

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

相关文章

第5天 | openGauss中一个用户可以访问多个数据库

接着昨天继续学习openGauss,今天是第五天了。今天学习内容是使用一个用户访问多个数据库。 老规矩&#xff0c;先登陆墨天轮为我准备的实训实验室 rootmodb:~# su - omm ommmodb:~$ gsql -r创建表空间music_tbs、数据库musicdb10 、用户user10 并赋予 sysadmin权限 omm# CREATE…

Vue3 Anime.js超级炫酷的网页动画库详解

简介 Anime.js 是一个轻量级的 JavaScript 动画库&#xff0c;它提供了简单而强大的 API 来创建各种复杂的动画效果。以下是 Anime.js 的主要使用方法和特性&#xff1a; 安装 npm install animejs 基本用法 <script setup> import { ref, onMounted } from "vu…

苦练Python第18天:Python异常处理锦囊

苦练Python第18天&#xff1a;Python异常处理锦囊 原文链接&#xff1a;https://dev.to/therahul_gupta/day-18100-exception-handling-with-try-except-in-python-3m5a 作者&#xff1a;Rahul Gupta 译者&#xff1a;倔强青铜三 前言 大家好&#xff0c;我是倔强青铜三。是一名…

JVM——如何对java的垃圾回收机制调优?

GC 调优的核心思路就是尽可能的使对象在年轻代被回收&#xff0c;减少对象进入老年代。 具体调优还是得看场景根据 GC 日志具体分析&#xff0c;常见的需要关注的指标是 Young GC 和 Full GC 触发频率、原因、晋升的速率、老年代内存占用量等等。 比如发现频繁会产生 Ful GC&am…

正则表达式使用示例

下面以 Vue&#xff08;前端&#xff09;和 Spring Boot&#xff08;后端&#xff09;为例&#xff0c;展示正则表达式在前后端交互中的应用&#xff0c;以邮箱格式验证为场景&#xff1a;1.前端<template><div class"register-container"><h3>用户…

云端微光,AI启航:低代码开发的智造未来

文章目录前言一、引言&#xff1a;技术浪潮中的个人视角初次体验腾讯云开发 Copilot1.1 低代码的时代机遇1.1.1 为什么低代码如此重要&#xff1f;1.2 AI 的引入&#xff1a;革新的力量1.1.2 Copilot 的亮点1.3 初学者的视角1.3.1 Copilot 带来的改变二、体验记录&#xff1a;云…

图片上传实现

图片上传change函数图片上传图片上传到服务器上传的图片在该页面中显示修改界面代码最终实现效果change函数 这里我们先用输入框控件来举例&#xff1a; 姓名&#xff1a;<input typetext classname>下面我们来写 js 语句&#xff0c;对控件进行绑事件来获取输入框内的…

【PTA数据结构 | C语言版】多叉堆的上下调整

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n 个已经满足 d 叉最小堆顺序约束的数据直接读入最小堆&#xff1b;随后将下一个读入的数据 x 插入堆&#xff1b;再执行删顶操作并输出删顶的元素&#xff1b;最后顺次输…

selenium后续!!

小项目案例:实现批量下载网页中的资源根据15.3.2小节中的返回网页内容可知,用户只有获取了网页中的图片url才可以将图片下载到*在使用selenium库渲染网页后,可直接通过正则表达式过滤出指定的网页图片&#xff0c;从而实现批量下载接下来以此为思路来实现一个小项目案例。项目任…

深度解析Linux文件I/O三级缓冲体系:用户缓冲区→标准I/O→内核页缓存

在Linux文件I/O操作中&#xff0c;缓冲区的管理是一个核心概念&#xff0c;主要涉及用户空间缓冲区和内核空间缓冲区。理解这两者的区别和工作原理对于高效的文件操作至关重要。 目录 一、什么是缓冲区 二、为什么要引入缓冲区机制 三、三级缓冲体系 1、三级缓冲体系全景图…

【每日算法】专题十三_队列 + 宽搜(bfs)

1. 算法思路 BFS 算法核心思路 BFS&#xff08;广度优先搜索&#xff09;使用 队列&#xff08;Queue&#xff09;按层级顺序遍历图或树的节点。以下是 C 实现的核心思路和代码模板&#xff1a; 算法框架 #include <queue> #include <vector> #include <un…

【动手实验】发送接收窗口对 TCP传输性能的影响

环境准备 服务器信息 两台腾讯云机器 t04&#xff08;172.19.0.4&#xff09;、t11&#xff08;172.19.0.11&#xff09;&#xff0c;系统为 Ubuntu 22.04&#xff0c;内核为 5.15.0-139-generic。默认 RT 在 0.16s 左右。 $ ping 172.19.0.4 PING 172.19.0.4 (172.19.0.4) …

28、鸿蒙Harmony Next开发:不依赖UI组件的全局气泡提示 (openPopup)和不依赖UI组件的全局菜单 (openMenu)、Toast

目录 不依赖UI组件的全局气泡提示 (openPopup) 弹出气泡 创建ComponentContent 绑定组件信息 设置弹出气泡样式 更新气泡样式 关闭气泡 在HAR包中使用全局气泡提示 不依赖UI组件的全局菜单 (openMenu) 弹出菜单 创建ComponentContent 绑定组件信息 设置弹出菜单样…

让老旧医疗设备“听懂”新语言:CAN转EtherCAT的医疗行业应用

在医疗影像设备的智能化升级中&#xff0c;通信协议的兼容性常成为工程师的“痛点”。例如&#xff0c;某医院的移动式X射线机采用CAN协议控制机械臂&#xff0c;而主控系统基于EtherCAT架构。两者协议差异导致数据延迟高达5ms&#xff0c;影像定位精度下降&#xff0c;甚至影响…

ubuntu基础搭建

ubuntu上docker的搭建 https://vulhub.org/zh 网站最下面找到开始使用&#xff0c;有搭建的命令//安装docker&#xff0c;连接失败多试几次 curl -fsSL https://get.docker.com | sh //验证Docker是否正确安装&#xff1a; docker version //还要验证Docker Compose是否可用&am…

动态规划 + DFS + 记忆化!Swift 解 LeetCode 329 的实战笔记

文章目录摘要描述题解答案题解代码分析代码解析示例测试及结果时间复杂度空间复杂度总结摘要 这篇文章带你用 Swift 实战一道非常经典的 DFS 记忆化搜索题目 —— LeetCode 329《矩阵中的最长递增路径》。看似一个简单的“走格子”游戏&#xff0c;实则考察了搜索顺序、剪枝策…

046_局部内部类与匿名内部类

一、局部内部类&#xff08;Local Inner Class&#xff09; 1.1 定义与基本概念 局部内部类是定义在方法、构造器或代码块内部的类&#xff0c;其作用域仅限于所在的局部范围&#xff08;定义它的方法、构造器或代码块&#xff09;&#xff0c;超出该范围则无法访问。 它的核心…

Jenkins Pipeline 中使用 JsonSlurper 报错:cannot find current thread

Jenkins Pipeline 中使用 JsonSlurper 报错&#xff1a;cannot find current thread&#x1f31f; 背景⚠ 问题重现&#x1f9e0; 原因解析&#xff1a;CPS 与非 CPS 安全方法冲突✅ 解决方案一&#xff1a;使用 NonCPS 注解&#xff08;经典方案&#xff09;✅ 解决方案二&…

Go 语言循环语句详解

Go 语言循环语句详解 在编程语言中&#xff0c;循环语句是实现重复执行某些代码块的关键元素。Go 语言作为现代编程语言之一&#xff0c;提供了多种循环结构来满足不同的编程需求。本文将详细讲解 Go 语言中的循环语句&#xff0c;包括 for、while 和 goto 语句&#xff0c;帮助…

day30——零基础学嵌入式之进程间通信1.0

一、进程间通信7种方式1.传统的进程间通信方式&#xff08;1&#xff09;管道①无名管道&#xff1a;②有名管道&#xff1a;&#xff08;2&#xff09;③信号&#xff08;3&#xff09;system Ⅴ 》系统Ⅴ 进程间通信方式 inner Process Comunication④共享内存 &#xff…