【使用 PyQt6-第02章】 创建信号、槽和事件

news/2024/7/27 8:29:01/文章来源:https://blog.csdn.net/gongdiwudu/article/details/137153715

目录

  • 一、说明
  • 二、信号和槽
  • 三、QPushButton信号
  • 四、接收数据
  • 五、存储数据
  • 六、改变接口
  • 七、直接将小部件连接在一起
  • 八、活动
  • 九、鼠标事件
  • 十、上下文菜单
  • 十一、事件层次结构
    • 11.1 Python继承转发
    • 11.2 Python布局转发

一、说明

   我们已经创建了一个窗口并向其中添加了一个简单的按钮小部件,但该按钮不执行任何操作。这根本不是很有用——当您创建 GUI 应用程序时,您通常希望它们做一些事情!我们需要的是一种将按下按钮的动作与某些事情发生联系起来的方法。在 Qt 中,这是由信号和槽或事件提供的。

二、信号和槽

信号是小部件在发生某些事情时发出的通知。该事物可以是任意数量的事物,从按下按钮,到输入框的文本发生变化,再到窗口的文本发生变化。许多信号是由用户操作发起的,但这不是规则。

除了通知正在发生的事情之外,信号还可以发送数据以提供有关所发生事情的附加上下文。

您还可以创建自己的自定义信号,我们稍后将对此进行探讨。

插槽是 Qt 用于信号接收器的名称。在 Python 中,应用程序中的任何函数(或方法)都可以用作槽——只需将信号连接到它即可。如果信号发送数据,那么接收函数也将接收该数据。许多 Qt 小部件也有自己的内置插槽,这意味着您可以直接将 Qt 小部件连接在一起。

让我们看一下 Qt 信号的基础知识,以及如何使用它们来连接小部件以使应用程序中的事情发生。

将以下应用程序大纲保存到名为app.py.

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButtonclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("My App")app = QApplication(sys.argv)window = MainWindow()
window.show()app.exec()

三、QPushButton信号

我们的简单应用程序目前有一个QMainWindow集合QPushButton作为中央小部件。让我们首先将此按钮连接到自定义 Python 方法。在这里,我们创建一个名为的简单自定义插槽the_button_was_clicked,它接受clicked来自QPushButton.

import sys
from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButtonclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("My App")button = QPushButton("Press Me!")button.setCheckable(True)button.clicked.connect(self.the_button_was_clicked)# Set the central widget of the Window.self.setCentralWidget(button)def the_button_was_clicked(self):print("Clicked!")app = QApplication(sys.argv)window = MainWindow()
window.show()app.exec()

运行!如果单击该按钮,您将看到文本“Clicked!”在控制台上。

Clicked!
Clicked!
Clicked!
Clicked!

四、接收数据

这是一个好的开始!我们已经听说信号还可以发送数据以提供有关刚刚发生的情况的更多信息。该.clicked信号也不例外,还为按钮提供了选中(或切换)状态。对于普通按钮,这始终是False,因此我们的第一个插槽忽略了此数据。但是,我们可以使按钮可检查并查看效果。

在下面的示例中,我们添加第二个槽来输出checkstate。

class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("My App")button = QPushButton("Press Me!")button.setCheckable(True)button.clicked.connect(self.the_button_was_clicked)button.clicked.connect(self.the_button_was_toggled)self.setCentralWidget(button)def the_button_was_clicked(self):print("Clicked!")def the_button_was_toggled(self, checked):print("Checked?", checked)

运行!如果您按下该按钮,您会看到它突出显示为已选中。再按一次即可释放。在控制台中查找检查状态。

Clicked!
Checked? True
Clicked!
Checked? False
Clicked!
Checked? True
Clicked!
Checked? False
Clicked!
Checked? True

您可以根据需要将任意数量的插槽连接到信号,并且可以在插槽上同时响应不同版本的信号。

五、存储数据

通常,将小部件的当前状态存储在 Python 变量中很有用。这允许您像任何其他 Python 变量一样使用这些值,而无需访问原始小部件。您可以将这些值存储为单独的变量,也可以根据需要使用字典。在下一个示例中,我们将按钮的检查button_is_checked值存储在名为on的变量中self。

class MainWindow(QMainWindow):def __init__(self):super().__init__()self.button_is_checked = Trueself.setWindowTitle("My App")button = QPushButton("Press Me!")button.setCheckable(True)button.clicked.connect(self.the_button_was_toggled)button.setChecked(self.button_is_checked)self.setCentralWidget(button)def the_button_was_toggled(self, checked):self.button_is_checked = checkedprint(self.button_is_checked)

首先,我们设置变量的默认值(为True),然后使用默认值设置小部件的初始状态。当小部件状态发生变化时,我们收到信号并更新变量以匹配。

您可以将相同的模式与任何 PyQt 小部件一起使用。如果小部件不提供发送当前状态的信号,您将需要直接在处理程序中从小部件检索值。例如,这里我们正在检查按下处理程序中的检查状态。

class MainWindow(QMainWindow):def __init__(self):super().__init__()self.button_is_checked = Trueself.setWindowTitle("My App")self.button = QPushButton("Press Me!")self.button.setCheckable(True)self.button.released.connect(self.the_button_was_released)self.button.setChecked(self.button_is_checked)self.setCentralWidget(self.button)def the_button_was_released(self):self.button_is_checked = self.button.isChecked()print(self.button_is_checked)

我们需要保留对按钮的引用,self以便我们可以在插槽中访问它。

当按钮被释放时,释放信号会触发,但不会发送检查状态,因此我们使用.isChecked()处理程序中的按钮获取检查状态。

六、改变接口

到目前为止,我们已经了解了如何接受信号并将输出打印到控制台。但是当我们点击按钮时让界面发生一些事情怎么样?让我们更新槽方法来修改按钮,更改文本并禁用按钮,使其不再可单击。我们现在还将关闭可检查状态。

class MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("My App")self.button = QPushButton("Press Me!")self.button.clicked.connect(self.the_button_was_clicked)self.setCentralWidget(self.button)def the_button_was_clicked(self):self.button.setText("You already clicked me.")self.button.setEnabled(False)# Also change the window title.self.setWindowTitle("My Oneshot App")

同样,因为我们需要能够button在我们的the_button_was_clicked方法中访问 ,所以我们在 上保留对它的引用self。通过传递strto来更改按钮的文本.setText()。要禁用按钮,.setEnabled()请使用False.

运行!如果单击该按钮,文本将发生变化并且该按钮将变得不可单击。

您不仅限于更改触发信号的按钮,您可以在插槽方法中执行任何您想要的操作。例如,尝试将以下行添加到the_button_was_clicked方法中以同时更改窗口标题。

self.setWindowTitle("A new window title")

大多数小部件都有自己的信号——QMainWindow我们用于窗口的信号也不例外。在下面更复杂的示例中,我们将.windowTitleChanged上的信号连接QMainWindow到自定义槽方法。

在下面的示例中,我们将.windowTitleChanged上的信号连接QMainWindow到方法 slot the_window_title_changed。该插槽还接收新的窗口标题。

from PyQt6.QtWidgets import QApplication, QMainWindow, QPushButtonimport sys
from random import choicewindow_titles = ['My App','My App','Still My App','Still My App','What on earth','What on earth','This is surprising','This is surprising','Something went wrong'
]class MainWindow(QMainWindow):def __init__(self):super().__init__()self.n_times_clicked = 0self.setWindowTitle("My App")self.button = QPushButton("Press Me!")self.button.clicked.connect(self.the_button_was_clicked)self.windowTitleChanged.connect(self.the_window_title_changed)# Set the central widget of the Window.self.setCentralWidget(self.button)def the_button_was_clicked(self):print("Clicked.")new_window_title = choice(window_titles)print("Setting title:  %s" % new_window_title)self.setWindowTitle(new_window_title)def the_window_title_changed(self, window_title):print("Window title changed: %s" % window_title)if window_title == 'Something went wrong':self.button.setDisabled(True)app = QApplication(sys.argv)window = MainWindow()
window.show()app.exec()

首先,我们设置一个窗口标题列表——我们将使用 Python 的内置random.choice().我们将自定义槽方法挂接the_window_title_changed到窗口的.windowTitleChanged信号上。

当我们单击按钮时,窗口标题将随机更改。如果新窗口标题等于“出现问题”,则该按钮将被禁用。

运行!重复单击该按钮,直到标题更改为“出现问题”并且该按钮将被禁用。

在此示例中,有几件事需要注意。

首先,设置窗口标题时windowTitleChanged并不总是发出信号。仅当新标题较前一标题发生更改时才会触发该信号。如果多次设置相同的标题,则只会在第一次时触发信号。仔细检查信号触发的条件非常重要,以避免在应用程序中使用它们时感到惊讶。

其次,请注意我们如何使用信号将事物链接在一起。发生一件事——按下按钮——可以依次触发其他多件事发生。这些后续影响不需要知道是什么造成的,而只是简单规则的结果。这种效果与其触发器的解耦是构建 GUI 应用程序时需要理解的关键概念之一。

在本节中,我们介绍了信号和槽。我们演示了一些简单的信号以及如何使用它们在应用程序中传递数据和状态。接下来我们将了解 Qt 提供的用于您的应用程序的小部件以及它们提供的信号。

七、直接将小部件连接在一起

到目前为止,我们已经看到了将小部件信号连接到 Python 方法的示例。当小部件发出信号时,我们的 Python 方法将被调用并接收来自信号的数据。但您并不总是需要使用 Python 函数来处理信号——您还可以将 Qt 小部件直接相互连接。

在下面的示例中,我们向窗口添加一个QLineEdit小部件和 a 。QLabel在\__init__for 窗口中,我们将行编辑信号.textChanged连接到.现在,每当文本发生变化时,都会将该文本接收到它的方法中。.setTextQLabelQLineEditQLabel.setText

from PyQt6.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QVBoxLayout, QWidgetimport sysclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("My App")self.label = QLabel()self.input = QLineEdit()self.input.textChanged.connect(self.label.setText)layout = QVBoxLayout()layout.addWidget(self.input)layout.addWidget(self.label)container = QWidget()container.setLayout(layout)# Set the central widget of the Window.self.setCentralWidget(container)app = QApplication(sys.argv)window = MainWindow()
window.show()app.exec()

请注意,为了将输入连接到标签,必须定义输入和标签。此代码将两个小部件添加到布局中,并将其设置在窗口上。稍后我们将详细介绍布局,您现在可以忽略它。

运行!在上面的框中输入一些文本,您会看到它立即出现在标签上。

输入中键入的任何文本都会立即显示在标签上
输入中键入的任何文本都会立即显示在标签上。

大多数 Qt 小部件都有可用的插槽,您可以将发出与其接受的类型相同的任何信号连接到该插槽。小部件文档在“公共插槽”下列出了每个小部件的插槽。例如,请参阅 https://doc.qt.io/qt-5/qlabel.html#public-slots[QLabel]。

八、活动

用户与 Qt 应用程序的每次交互都是一个事件。事件有多种类型,每种类型代表不同类型的交互。 Qt 使用事件对象来表示这些事件,事件对象打包有关所发生事件的信息。这些事件被传递到发生交互的小部件上的特定事件处理程序。

通过定义自定义或扩展事件处理程序,您可以改变小部件响应这些事件的方式。事件处理程序的定义与任何其他方法一样,但名称特定于它们处理的事件类型。

小部件接收的主要事件之一是QMouseEvent. QMouseEvent 事件是为小部件上的每次鼠标移动和按钮单击创建的。以下事件处理程序可用于处理鼠标事件——

事件处理程序 事件类型已移动
mouseMoveEvent 鼠标移动了
mousePressEvent 鼠标按钮被按下
mouseReleaseEvent 释放鼠标按钮
mouseDoubleClickEvent 检测到双击
例如,单击某个小部件将导致QMouseEvent将 a 发送到.mousePressEvent该小部件上的事件处理程序。该处理程序可以使用事件对象来查找有关所发生事件的信息,例如触发事件的原因以及事件发生的具体位置。

您可以通过子类化并覆盖类上的处理程序方法来拦截事件。您可以选择过滤、修改或忽略事件,通过使用 调用父类函数将它们传递给事件的普通处理程序super()。这些可以添加到您的主窗口类中,如下所示。在每种情况下e都会收到传入的事件。

import sysfrom PyQt6.QtCore import Qt
from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow, QTextEditclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.label = QLabel("Click in this window")self.setCentralWidget(self.label)def mouseMoveEvent(self, e):self.label.setText("mouseMoveEvent")def mousePressEvent(self, e):self.label.setText("mousePressEvent")def mouseReleaseEvent(self, e):self.label.setText("mouseReleaseEvent")def mouseDoubleClickEvent(self, e):self.label.setText("mouseDoubleClickEvent")app = QApplication(sys.argv)window = MainWindow()
window.show()app.exec()

运行!尝试在窗口中移动和单击(以及双击)并观察事件的出现。

您会注意到,只有按下按钮时才会注册鼠标移动事件。您可以通过调用self.setMouseTracking(True)窗口来更改此设置。您可能还注意到,按下按钮时,按下(单击)和双击事件都会触发。仅当释放按钮时才会触发释放事件。通常,要注册用户的单击,您应该同时观察鼠标的按下和释放。

在事件处理程序中,您可以访问事件对象。该对象包含有关事件的信息,可用于根据具体发生的情况做出不同的响应。接下来我们将看看鼠标事件对象。

九、鼠标事件

Qt 中的所有鼠标事件都通过该对象进行跟踪QMouseEvent,并且可以从以下事件方法读取有关该事件的信息。

方法 退货
.button() 触发此事件的特定按钮
.buttons() 所有鼠标按钮的状态(OR’ed 标志)
.position() 小部件相对位置(QPoint 整数)
您可以在事件处理程序中使用这些方法来以不同的方式响应不同的事件,或者完全忽略它们。位置方法以对象的形式提供全局和本地(小部件相对)位置信息QPoint,而按钮则使用命名空间中的鼠标按钮类型来报告Qt。

例如,以下内容允许我们对窗口上的左键、右键或中键单击做出不同的响应。

def mousePressEvent(self, e):if e.button() == Qt.MouseButton.LeftButton:# handle the left-button press in hereself.label.setText("mousePressEvent LEFT")elif e.button() == Qt.MouseButton.MiddleButton:# handle the middle-button press in here.self.label.setText("mousePressEvent MIDDLE")elif e.button() == Qt.MouseButton.RightButton:# handle the right-button press in here.self.label.setText("mousePressEvent RIGHT")def mouseReleaseEvent(self, e):if e.button() == Qt.MouseButton.LeftButton:self.label.setText("mouseReleaseEvent LEFT")elif e.button() == Qt.MouseButton.MiddleButton:self.label.setText("mouseReleaseEvent MIDDLE")elif e.button() == Qt.MouseButton.RightButton:self.label.setText("mouseReleaseEvent RIGHT")def mouseDoubleClickEvent(self, e):if e.button() == Qt.MouseButton.LeftButton:self.label.setText("mouseDoubleClickEvent LEFT")elif e.button() == Qt.MouseButton.MiddleButton:self.label.setText("mouseDoubleClickEvent MIDDLE")elif e.button() == Qt.MouseButton.RightButton:self.label.setText("mouseDoubleClickEvent RIGHT")

按钮标识符在 Qt 命名空间中定义,如下 –

标识符 值(二进制) 代表
Qt.MouseButton.NoButton 0 ( 000) 没有按下按钮,或者事件与按钮按下无关。
Qt.MouseButton.LeftButton 1 ( 001) 左键被按下
Qt.MouseButton.RightButton 2 ( 010) 右侧按钮被按下。
Qt.MouseButton.MiddleButton 4 ( 100) 中间的按钮被按下。
在惯用左手的鼠标上,左右按钮的位置是相反的,即按下最右边的按钮将返回Qt.LeftButton。这意味着您不需要在代码中考虑鼠标方向。

十、上下文菜单

上下文菜单是小的上下文相关菜单,通常在右键单击窗口时出现。 Qt 支持生成这些菜单,并且小部件具有用于触发它们的特定事件。在下面的示例中,我们将拦截.contextMenuEventa QMainWindow。每当要显示上下文菜单时都会触发此事件,并传递一个event类型的值QContextMenuEvent。

要拦截该事件,我们只需使用同名的新方法覆盖对象方法即可。因此,在这种情况下,我们可以在子MainWindow类上创建一个名为 的方法contextMenuEvent,它将接收该类型的所有事件。

import sysfrom PyQt6.QtCore import Qt
from PyQt6.QtGui import QAction
from PyQt6.QtWidgets import QApplication, QLabel, QMainWindow, QMenuclass MainWindow(QMainWindow):def __init__(self):super().__init__()def contextMenuEvent(self, e):context = QMenu(self)context.addAction(QAction("test 1", self))context.addAction(QAction("test 2", self))context.addAction(QAction("test 3", self))context.exec(e.globalPos())app = QApplication(sys.argv)window = MainWindow()
window.show()app.exec()

如果运行上面的代码并在窗口中右键单击,您将看到出现一个上下文菜单。您可以.triggered照常在菜单操作上设置插槽(并重复使用为菜单和工具栏定义的操作)。

将初始位置传递给exec函数时,这必须相对于定义时传入的父级。在本例中,我们self作为父级传递,因此我们可以使用全局位置。

为了完整起见,实际上有一种基于信号的方法来创建上下文菜单。

class MainWindow(QMainWindow):def __init__(self):super().__init__()self.show()self.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)self.customContextMenuRequested.connect(self.on_context_menu)def on_context_menu(self, pos):context = QMenu(self)context.addAction(QAction("test 1", self))context.addAction(QAction("test 2", self))context.addAction(QAction("test 3", self))context.exec(self.mapToGlobal(pos))

这完全取决于您的选择。

十一、事件层次结构

在 PyQt 中,每个小部件都是两个不同层次结构的一部分:Python 对象层次结构和 Qt 布局层次结构。您响应或忽略事件的方式可能会影响您的 UI 行为。

11.1 Python继承转发

通常,您可能希望拦截事件,对其执行某些操作,但仍然触发默认的事件处理行为。如果您的对象是从标准小部件继承的,则它可能会默认实现合理的行为。您可以通过使用调用父实现来触发此操作super()。

这是 Python 父类,而不是 PyQt .parent()。

def mousePressEvent(self, event):print("Mouse pressed!")super().mousePressEvent(event)

该事件将继续正常运行,但您添加了一些非干扰行为。

11.2 Python布局转发

当您向应用程序添加一个小部件时,它还会从布局中获取另一个父部件。可以通过调用 来找到小部件的父级.parent()。有时您手动指定这些父项,例如 forQMenu或QDialog,通常它是自动的。例如,当您将一个小部件添加到主窗口时,主窗口将成为该小部件的父窗口。

当为用户与 UI 交互创建事件时,这些事件将传递到UI 中最上面的小部件。因此,如果窗口上有一个按钮,然后单击该按钮,该按钮将首先接收该事件。

如果第一个小部件无法处理该事件,或者选择不处理该事件,则该事件将向上冒泡到父小部件,该父小部件将被轮流处理。这种冒泡一直持续到嵌套小部件,直到事件被处理或到达主窗口。

在您自己的事件处理程序中,您可以选择将事件标记为已处理 调用.accept()–

class CustomButton(QPushButton)def mousePressEvent(self, e):e.accept()

或者,您可以通过调用事件对象将其标记为未处理.ignore()。在这种情况下,事件将继续在层次结构中向上冒泡。

class CustomButton(QPushButton)def event(self, e):e.ignore()

如果您希望您的小部件对事件显示为透明,您可以安全地忽略您实际上以某种方式响应的事件。同样,您可以选择接受您未响应的事件以使它们保持沉默。

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

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

相关文章

【Python项目】AI动物识别工具

目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域,拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中,鉴于地球的广阔地域和多样的气候条件,利用图像技术捕…

推荐一款命令行随机数据生成工具

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 在shigen之前的文章如何用python优雅的生成模拟数据中,采用了faker这…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

系列文章目录 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装 嵌入式|蓝桥杯STM32G431(…

C++初学者:优雅创建第一个窗口

我想学习C做一些实用的程序,但是我不想在软件界面上花太多的时间,可是每每就是界面影响我的思绪。 今天学习C类的包装知识,终于整出了一个我的界面类,虽然封装水平很弱, 这次就用这个类,写了自己工作上常用…

力扣——接雨水

题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高…

玩转ChatGPT:Suno制作音乐

AI开始进军音乐领域了。 一款音乐AI神器——Suno V3发布,它能够处理从间奏到主歌、副歌、桥段直至尾奏的完整结构,零门槛创作音乐。 需要科学上网,官方网站:https://app.suno.ai/ 使用GPT写个歌词,然后丢进Suno生成…

【C++】二分查找算法(模板)

重点 只需要记住两点: 1.left right 时,一定就是最终结果(包括找不到目标值),无需再次判断,如果判断就会死循环 2.求中点如果是求左端点 mid left (right - left)/2 如果是求右端点 mid left (right -…

【学习】兼容性测试为何如此重要

兼容性测试是软件测试中非常重要的一环,旨在确保软件在不同的平台、浏览器、操作系统等环境下能够正常运行,并且不会出现兼容性问题。本文将介绍兼容性测试的概念、重要性、实施步骤及实践案例,帮助读者更好地理解兼容性测试在软件开发中的重…

Redis的高可用(主从复制、哨兵模式、集群)的概述及部署

目录 一、Redis主从复制 1、Redis的主从复制的概念 2、Redis主从复制的作用 ①数据冗余: ②故障恢复: ③负载均衡: ④高可用基石: 3、Redis主从复制的流程 4、Redis主从复制的搭建 4.1、配置环境以及安装包 4.2所有主机…

基于 java + Springboot + vue +mysql 大学生实习管理系统(含源码)

目录 📚 前言 📑摘要 📑实习管理系统的特点 📑使用架构 📚 总体设计 📚 数据库设计 💬 系统公告实体属性 💬 单位成绩实体属性 💬 学生实体属性 📚 系…

Java复习第十四天学习笔记(CSS),附有道云笔记链接

【有道云笔记】十四 3.30 CSS https://note.youdao.com/s/3VormGXs 一、CSS定义和基本选择器 CSS定义:cascading style sheet 层叠样式表。 语法: 选择器 { 属性名1:属性值1; 属性名2:属性值2; 属性名3:属性值3; 属性名4:属性值4; } CSS使用&a…

【Qt 学习笔记】Qt 开发环境的搭建 | Qt 安装教程

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt 开发环境的搭建 | Qt 安装教程 文章编号:Qt 学习笔记 /…

STM32CubeMX配置步骤详解二 —— 下载(2)

接前一篇文章:STM32CubeMX配置步骤详解一 —— 下载(1) 一、STM32CubeMX下载 上一回讲解了从ST官网上下载STM32CubeMX的详细步骤,并且最终成功下载了“en.stm32cubemx-win-v6-11-0.zip”文件。 本回介绍一下其它下载方式。 2. 从CSDN下载 除了从ST官网下载之外,也可以…

26. UE5 RPG同步面板属性(二)

在上一篇,我们解析了UI属性面板的实现步骤: 首先我们需要通过c去实现创建GameplayTag,这样可以在c和UE里同时获取到Tag创建一个DataAsset类,用于设置tag对应的属性和显示内容创建AttributeMenuWidgetController实现对应逻辑 并且…

【OpenCV】 基础入门(一)初识 Mat 类 | 通过 Mat 类显示图像

🚀 个人简介:CSDN「博客新星」TOP 10 , C/C 领域新星创作者💟 作 者:锡兰_CC ❣️📝 专 栏:【OpenCV • c】计算机视觉🌈 若有帮助,还请关注➕点赞➕收藏&#xff…

【漏洞复现】WordPress Plugin LearnDash LMS 敏感信息暴漏

漏洞描述 WordPress和WordPress plugin都是WordPress基金会的产品。WordPress是一套使用PHP语言开发的博客平台。该平台支持在PHP和MySQL的服务器上架设个人博客网站。WordPress plugin是一个应用插件。 WordPress Plugin LearnDash LMS 4.10.2及之前版本存在安全漏洞&#x…

算法学习——LeetCode力扣图论篇2(1020. 飞地的数量、130. 被围绕的区域、827. 最大人工岛)

算法学习——LeetCode力扣图论篇2 1020. 飞地的数量 1020. 飞地的数量 - 力扣(LeetCode) 描述 给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。 一次 移动 是指从一个陆地单元格走到另一个相…

wps没保存关闭了恢复数据教程

有时候我们因为电脑问题会忘记保存就关闭wps导致数据丢失,不知道wps没保存关闭了怎么恢复数据,其实数据是无法恢复的。 wps没保存关闭了怎么恢复数据 1、wps没有数据恢复功能,不过可以开启自动备份。 2、我们可以先点击wps左上角的“文件”…

Docker 哲学 - push 本机镜像 到 dockerhub

注意事项: 1、 登录 docker 账号 docker login 2、docker images 查看本地镜像 3、注意的是 push镜像时 镜像的tag 需要与 dockerhub的用户名保持一致 eg:本地镜像 express:1 直接 docker push express:1 无法成功 原因docker不能识别 push到哪里 …

RDGCN阅读笔记

Relation-Aware Entity Alignment for Heterogeneous Knowledge Graphs 面向异质知识图谱的关系感知实体对齐 Abstract 实体对齐是从不同的知识图(KGs)中链接具有相同真实世界实体的任务,最近被基于嵌入的方法所主导。这种方法通过学习KG表示来工作,以…