当前位置: 首页 > news >正文

Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法

Qt 中的信息输出机制

  • 介绍
  • QDebug
    • 在 Qt 中使用 qDebug
    • 输出不同类型的信息
      • 浮点数:使用 %!f(MISSING) 格式化符号输出浮点数
      • 布尔值:使用 %! (MISSING)和 %! (MISSING)格式化符号输出布尔值
      • 对象:使用 qPrintable() 函数输出对象的信息
  • qInfo
  • qWarning
  • qCritical
  • 自定义信息输出格式
  • 不同输出方式的区别和底层逻辑
  • 总结

介绍

在 Qt 中,信息输出机制用于在程序运行时输出各种信息,包括调试信息、提示信息、警告信息和错误信息等。Qt 提供了多种信息输出机制,主要包括以下几种:

  • qDebug:最常用的信息输出机制,用于输出各种调试信息,例如变量的值、函数的返回值和对象的状态等。可以通过在代码中添加 qDebug() 语句来输出信息。
  • qInfo:用于输出提示信息,例如程序启动信息和操作成功信息等。可以通过在代码中添加 qInfo() 语句来输出信息。
  • qWarning:用于输出警告信息,例如一些异常但不致命的错误信息。可以通过在代码中添加 qWarning() 语句来输出信息。
  • qCritical:用于输出错误信息,例如一些致命的错误信息。可以通过在代码中添加 qCritical() 语句来输出信息。

每种信息输出机制都有不同的作用和使用场景,可以根据需要进行选择。例如,在调试过程中,可以使用 qDebug 输出各种调试信息,以便快速定位和解决问题。而在生产环境中,可以使用 qInfo 输出一些重要的提示信息,以便用户了解程序的运行状况。
需要注意的是,信息输出机制可能会对程序的性能产生影响,因此在使用时需要慎重考虑。可以通过在编译时添加宏定义的方式来控制信息输出,例如通过定义 QT_NO_DEBUG 宏来禁用 qDebug 输出。


QDebug

在 Qt 中,使用 qDebug 输出调试信息是一种常用的调试方法,可以在程序运行时输出各种调试信息,例如变量的值、函数的返回值和对象的状态等。下面介绍如何在 Qt 中使用 qDebug 输出调试信息,并输出不同类型的信息。

在 Qt 中使用 qDebug

使用 qDebug 输出调试信息非常简单,只需要在代码中添加 qDebug() 语句,即可在程序运行时输出信息。例如,下面的代码输出了一个字符串和一个整数的值:

QString str = "Hello, world!";
int num = 123;
qDebug() << str << num;

在程序运行时,会输出如下信息:
Hello, world!" 123
需要注意的是,qDebug 输出的信息会自动换行,并以空格分隔不同的参数。如果需要输出多行信息,可以在每行末尾添加 << '\n',例如:

qDebug() << "Line 1" << '\n'<< "Line 2" << '\n';

输出不同类型的信息

除了字符串和整数外,qDebug 还可以输出其他类型的信息,例如浮点数、布尔值和对象等。下面分别介绍如何>输出这些类型的信息:

浮点数:使用 %!f(MISSING) 格式化符号输出浮点数

double pi = 3.1415926;
qDebug() << "PI = " << QString::number(pi, 'f', 2);

输出结果为:

PI = 3.14

布尔值:使用 %! (MISSING)和 %! (MISSING)格式化符号输出布尔值

bool flag = true;
qDebug() << "Flag = " << (flag ? "true" : "false");

输出结果为:
Flag = true

对象:使用 qPrintable() 函数输出对象的信息

QPoint pt(10, 20);
qDebug() << "Point = " << qPrintable(pt.toString());

输出结果为:

Point = QPoint(10, 20)

需要注意的是,qDebug 输出的信息只在调试模式下有效,因此在发布程序时应该尽可能避免使用 qDebug 输出调试信息。可以使用 qInfo、qWarning 或 qCritical 输出不同级别的信息,以便在发布程序时更好地控制输出。


qInfo

在Qt中使用qInfo输出提示信息是非常简单的,只需要包含#include 和#include 这两个头文件即可。其中QLoggingCategory头文件定义了日志类别,而QtDebug头文件定义了用于调试的一系列宏。
在输出提示信息之前,我们需要设置日志类别。我们可以通过以下语句设置日志类别:

QLoggingCategory::setFilterRules(".debug=true\n.warning=false");

这句话的意思是将所有debug级别的信息输出,将所有warning级别的信息过滤掉。

然后我们就可以使用qInfo来输出提示信息了。
qInfo有多种使用方式,可以输出不同类型的提示信息,例如:

qInfo() << "This is an informational message."; 
qInfo("This is an informational message with a category: %!s(MISSING)", QLoggingCategory::defaultCategory()->categoryName().toUtf8().constData()); 
qInfo() << "The > time is" << QTime::currentTime();

第一种方式是最简单的方式,它可以输出一个简单的提示信息。
第二种方式可以将信息分类,方便我们查看和管理不同类型的信息。
第三种方式可以输出一些带参数的信息,例如当前时间。

除了qInfo之外,Qt中还提供了其他的输出提示信息的函数,例如qWarning、qCritical和qFatal等。它们分别用于输出警告、错误和致命错误信息,使用方式与qInfo类似。

最后需要注意的是,在发布版本中,我们应该关闭所有输出提示信息的功能,以提高程序的性能和安全性。我们可以通过设置日志类别来实现这一点,例如:

QLoggingCategory::setFilterRules(".debug=false\n.warning=false\n*.error=false\n*.fatal=false");
这句话的意思是将所有级别的信息都过滤掉,从而关闭输出提示信息的功能。


qWarning

在Qt中使用qWarning输出警告信息也很简单,只需要包含#include 头文件即可。和qInfo类似,我们也可以使用qWarning来输出不同类型的警告信息。

例如:

qWarning() << "This is a warning message."; 
qWarning("This is a warning message with a category: %!!(MISSING)s(MISSING)", QLoggingCategory::defaultCategory()->>categoryName().toUtf8().constData()); 
qWarning() << "The input value is invalid: " << inputValue;

第一种方式是最简单的方式,它可以输出一个简单的警告信息。
第二种方式可以将信息分类,方便我们查看和管理不同类型的信息。
第三种方式可以输出一些带参数的信息,例如输入值无效的警告信息。

需要注意的是,qWarning的使用和qInfo类似,但输出的信息应该是一些警告信息,而不是一些普通的提示信息。在程序开发中,我们应该根据需要使用不同的输出机制,以便更好地管理和调试程序。


qCritical

在Qt中使用qCritical输出错误信息也很简单,只需要包含#include 头文件即可。和qInfo和qWarning类似,我们也可以使用qCritical来输出不同类型的错误信息。

例如:

qCritical() << "This is a critical error message."; 
qCritical("This is a critical error message with a category: %!!(MISSING)!(MISSING)s(MISSING)", >QLoggingCategory::defaultCategory()->categoryName().toUtf8().constData()); 
qCritical() << "The file cannot be opened: " << fileName;

第一种方式是最简单的方式,它可以输出一个简单的错误信息。

第二种方式可以将信息分类,方便我们查看和管理不同类型的信息。

第三种方式可以输出一些带参数的信息,例如文件无法打开的错误信息。

需要注意的是,qCritical的使用和qInfo、qWarning类似,但输出的信息应该是一些严重的错误信息,例如文件无法打开、内存分配失败等。在程序开发中,我们应该根据需要使用不同的输出机制,以便更好地管理和调试程序。


自定义信息输出格式

在Qt中自定义信息输出格式可以通过qInstallMessageHandler函数来实现,该函数可以安装一个自定义的消息处理程序,用于处理Qt中的所有消息。
例如,我们可以创建一个名为myMessageOutput的函数,用于处理输出信息,并将它安装为消息处理程序。在该函数中,我们可以使用QString::asprintf函数来设置输出信息的格式,例如添加时间戳、文件名和行号等。
示例代码如下:

#include <QtDebug>void myMessageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg)
{QByteArray localMsg = msg.toLocal8Bit();switch (type) {case QtDebugMsg:fprintf(stderr, "[%!s(MISSING)] Debug: %!s(MISSING) (%!s(MISSING):%!u(MISSING), %!s(MISSING))\n", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData(), localMsg.constData(), context.file, context.line, context.function);break;case QtInfoMsg:fprintf(stderr, "[%!s(MISSING)] Info: %!s(MISSING) (%!s(MISSING):%!u(MISSING), %!s(MISSING))\n", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData(), localMsg.constData(), context.file, context.line, context.function);break;case QtWarningMsg:fprintf(stderr, "[%!s(MISSING)] Warning: %!s(MISSING) (%!s(MISSING):%!u(MISSING), %!s(MISSING))\n", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData(), localMsg.constData(), context.file, context.line, context.function);break;case QtCriticalMsg:fprintf(stderr, "[%!s(MISSING)] Critical: %!s(MISSING) (%!s(MISSING):%!u(MISSING), %!s(MISSING))\n", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData(), localMsg.constData(), context.file, context.line, context.function);break;case QtFatalMsg:fprintf(stderr, "[%!s(MISSING)] Fatal: %!s(MISSING) (%!s(MISSING):%!u(MISSING), %!s(MISSING))\n", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz").toUtf8().constData(), localMsg.constData(), context.file, context.line, context.function);abort();}
}int main(int argc, char *argv[])
{qInstallMessageHandler(myMessageOutput);// 程序代码return 0;
}

在该示例代码中,我们创建了一个名为myMessageOutput的函数,用于处理输出信息。在该函数中,我们使用QString::asprintf函数来设置输出信息的格式,例如添加时间戳、文件名和行号等。然后,我们使用qInstallMessageHandler函数将myMessageOutput函数安装为消息处理程序,从而实现自定义信息输出格式的功能。
需要注意的是,在自定义信息输出格式时,我们应该根据需要添加所需的信息,但不要添加过多的信息,以免影响程序的性能和可读性。同时,在发布版本中,我们应该关闭所有输出提示信息的功能,以提高程序的性能和安全性。


不同输出方式的区别和底层逻辑

在Qt中,qDebug、qInfo、qWarning和qCritical是用于输出不同级别信息的函数,它们分别对应调试信息、提示信息、警告信息和错误信息。它们的区别和底层逻辑如下:

  • qDebug qDebug是用于输出调试信息的函数,它的输出级别最低,可以输出一些调试信息,例如变量的值、程序的运行状态等。在发布版本中,该函数的输出信息会被自动过滤掉,从而不会影响程序的性能和安全性。
    底层逻辑:qDebug函数实际上是一个宏,它会在编译时根据当前编译环境的设置,将调试信息输出到标准输出流(stdout)中。
  • qInfo qInfo是用于输出提示信息的函数,它的输出级别比qDebug高,可以输出一些重要的提示信息,例如程序的运行状态、用户的操作等。
    底层逻辑:qInfo函数实际上是一个宏,它会在编译时根据当前编译环境的设置,将提示信息输出到标准输出流(stdout)中。
  • qWarning qWarning是用于输出警告信息的函数,它的输出级别比qInfo高,可以输出一些警告信息,例如输入值无效、文件无法打开等。在发布版本中,该函数的输出信息会被自动过滤掉,从而不会影响程序的性能和安全性。
    底层逻辑:qWarning函数实际上是一个宏,它会在编译时根据当前编译环境的设置,将警告信息输出到标准错误流(stderr)中。
  • qCritical qCritical是用于输出错误信息的函数,它的输出级别最高,可以输出一些严重的错误信息,例如内存分配失败、数据库连接失败等。
    底层逻辑:qCritical函数实际上是一个宏,它会在编译时根据当前编译环境的设置,将错误信息输出到标准错误流(stderr)中。

总的来说,这些函数的区别在于输出信息的级别和类型不同,底层逻辑也有所区别。在程序开发中,我们应该根据需要使用不同的输出机制,以便更好地管理和调试程序。

总结

在 Qt 中,信息输出是调试和排错工作中不可或缺的一部分。Qt 提供了多种信息输出机制,包括 qDebug、qInfo、qWarning 和 qCritical 等,每种机制都有不同的作用和使用场景。在使用时,需要根据实际需求选择合适的信息输出机制,并注意输出信息的类型和格式。
QDebug 是 Qt 中最常用的信息输出机制,可以输出各种调试信息;qInfo 是用于输出提示信息的机制;qWarning 是用于输出警告信息的机制;qCritical 是用于输出错误信息的机制。除了这些基本机制外,Qt 还提供了自定义信息输出格式的功能,可以根据需要设置时间戳、文件名和行号等信息。
在使用信息输出机制时,需要注意避免过度使用,以免影响程序的性能。同时,还需要根据实际需求选择合适的信息输出级别,以便快速定位和解决问题。

相关文章:

Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法

Qt 中的信息输出机制介绍QDebug在 Qt 中使用 qDebug输出不同类型的信息浮点数&#xff1a;使用 %!f(MISSING) 格式化符号输出浮点数布尔值&#xff1a;使用 %! (MISSING)和 %! (MISSING)格式化符号输出布尔值对象&#xff1a;使用 qPrintable() 函数输出对象的信息qInfoqWarnin…...

C++读写excel文件的的第三方库

一、比较流行的库 1. OpenXLSX 用于读取、写入、创建和修改 Microsoft Excel (.xlsx) 文件的 C 库。 2. xlnt xlnt 是一个现代 C 库&#xff0c;用于操作内存中的电子表格以及从 XLSX 文件读取/写入它们&#xff0c;如ECMA 376 第 4 版中所述。xlnt 1.0 版的首次公开发布是在 …...

【关于Linux中----多线程(一)】

文章目录认识线程创建线程线程优点和缺点创建一批线程终止线程线程的等待问题认识线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&a…...

2023年全国最新安全员精选真题及答案34

百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 11.&#xff08;单选题&#xff09;物料提升机附墙架设置要符合设计要求&#xff0c;但…...

数据出境是什么意思?我国数据出境合规要求是什么?

随着经济全球化深入以及云计算等技术的发展&#xff0c;数据在全球范围跨境流动。数据跨境在促进经济增长、加速创新的同时&#xff0c;对数据主权、数据权属、个人信息保护等一系列问题逐渐浮出水面。今天我们就先来了解一下数据出境是什么意思&#xff1f;我国数据出境合规要…...

Liunx——Git工具使用

目录 1&#xff09;使用 git 命令行安装 git 2&#xff09;在 Gitee 创建仓库 创建仓库 3&#xff09;Linux克隆仓库到本地 4&#xff09;提交代码三板斧&#xff1a; 1.三板斧第一招: git add 2.三板斧第二招: git commit 3.三板斧第三招: git push 5&#xff09;所遇…...

微软语音合成工具+基于Electron + Vue + ElementPlus + Vite 构建并能将文字转换为语音 MP3

微软语音合成工具基于Electron Vue ElementPlus Vite 构建并能将文字转换为语音 MP3 资源下&#xff1a;微软语音合成工具基于ElectronVueElementPlusVite构建并能将文字转换为语音MP3资源-CSDN文库 本文将介绍如何使用微软语音合成工具和前端技术栈进行开发&#xff0c;…...

Mongodb学习笔记2

文章目录前言一、搭建项目二、开始编写java代码1. 新增2.查询3. 修改4. 删除5.根据条件查询6. 关联查询7. 索引相关总结前言 MongoTemplate 相关操作 CRUD,聚合查询等; 一、搭建项目 springboot项目创建引入mongo 依赖docker 安装好mongo数据库配置yml 链接mongo spring:dat…...

学习Tensorflow之基本操作

学习Tensorflow之基本操作Tensorflow基本操作1. 创建张量(1) 创建标量(2) 创建向量(3) 创建矩阵(4) shape属性(5) 判别张量类型(6) 列表和ndarray转张量2. 创建特殊张量(1) tf.ones与tf.ones_like(2) tf.zeros与tf.zeros_like(3) tf.fill(3) tf.random.normal(4) tf.random.uni…...

《Spring系列》第2章 解析XML获取Bean

一、基础代码 Spring加载bean实例的代码 public static void main(String[] args) throws IOException {// 1.获取资源Resource resource new ClassPathResource("bean.xml");// 2.获取BeanFactoryDefaultListableBeanFactory factory new DefaultListableBeanFa…...

小红书20230326暑假实习笔试

第一题&#xff1a;加密 小明学会了一种加密方式。他定义suc(x)为x在字母表中的后继&#xff0c;例如a的后继为b&#xff0c;b的后继为c… &#xff08;即按字母表的顺序后一个&#xff09;。特别的&#xff0c;z的后继为a。对于一个原字符串S&#xff0c;将其中每个字母x都替…...

【java】不要二、把字符串转成整数

目录 &#x1f525;一、编程题 1.不要二 2.把字符串转换成整数 &#x1f525;一、编程题 1.不要二 链接&#xff1a;不要二_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a;二货小易有一个W*H的网格盒子&#xff0c;网格的行编号为0~H-1&#xff0c;网格的列编号为0~W-1…...

数据的质量管控工作

数据的质量管控工作&#xff0c;整个工作应该围绕启动阶段制定的目标进行。适当引入一些质量管控工具可帮助我们更高效的完成工作。 第一步、数据剖析 首先应该进行已知数据问题的评估&#xff0c;这里评估的范围也应控制本轮管控的目标范围内。其次&#xff0c;通过对数据进行…...

【SpringBoot笔记29】SpringBoot集成RabbitMQ消息队列

这篇文章,主要介绍SpringBoot如何集成RabbitMQ消息队列。 目录 一、集成RabbitMQ 1.1、引入amqp依赖 1.2、添加连接信息 1.3、添加RabbitMQ配置类...

前端架构师-week2-脚手架架构设计和框架搭建

将收获什么 脚手架的实现原理 Lerna的常见用法 架构设计技巧和架构图绘制方法 主要内容 学习如何以架构师的角度思考基础架构问题 多 Package 项目管理痛点和解决方案&#xff0c;基于 Lerna 脚手架框架搭建 imooc-cli 脚手架需求分析和架构设计&#xff0c;架构设计图 附赠内…...

CMake项目实战指令详细分析

CMake是一个跨平台的自动化构建系统&#xff0c;可以用简单的语句来描述所有平台的编译过程。CMake可以输出各种各样的编译文件&#xff0c;如Makefile、VisualStudio等。 CMake主要是编写CMakeLists.txt文件&#xff0c;然后用cmake命令将CMakeLists.txt文件转化为make所需要的…...

【深度学习】——LSTM参数设置

批大小设置 LSTM的批大小可以根据训练数据集的大小和计算资源的限制来确定。一般而言&#xff0c;批大小越大&#xff0c;训练速度越快&#xff0c;但可能会导致过拟合和内存限制。批大小越小&#xff0c;训练速度越慢&#xff0c;但对于较大的数据集和内存限制较严格的情况下…...

计算机网络高频60问 背完差不多了!!

计算机网络高频60问 网络分层结构 计算机网络体系大致分为三种&#xff0c;OSI七层模型、TCP/IP四层模型和五层模型。一般面试的时候考察比较多的是五层模型。 五层模型&#xff1a;应用层、传输层、网络层、数据链路层、物理层。 应用层&#xff1a;为应用程序提供交互服务…...

路由策略小实验

实验要求&#xff1a; 1、R1环回使用重发布&#xff0c;R2和R3使用双向重发布 2、使用路由策略解决&#xff0c;选路不佳 第一步&#xff0c;基础配置 [R1]int l0 [R1-LoopBack0]ip add 1.1.1.1 24 [R1-LoopBack0]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 192.168.12.1 …...

C语言realloc背后的内存管理

malloc申请内存&#xff0c;但不初始化。 calloc申请内存&#xff0c;且初始化为0。 free释放内存。 realloc重新分配已经分配的内存空间&#xff0c;可以变小&#xff0c;也可以变大。 以前一直有一个疑问&#xff0c;realloc是不是经常失败&#xff1f; 其实&#xff0c;rea…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...