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

Qt中的全局函数讲解集合(全)

目录

1.qAbs

2.qAsConst

3.qBound

4.qConstOverload

5.qEnvironmentVariable

6.qExchange

7.qFloatDistance

8.qInstallMessageHandler


在头文件<QtGlobal>中包含了Qt的全局函数,现在就这些全局函数一一详解。

1.qAbs

原型:

template <typename T> T qAbs(const T &t)

一个用于计算绝对值的函数。它可以用于计算各种数值类型的绝对值,包括整数、浮点数等

示例如下:

#include <QtCore/QCoreApplication>
#include <QtCore/qmath.h>
#include <iostream>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int num1 = -5;double num2 = -3.14;// 使用qAbs计算绝对值int absNum1 = qAbs(num1);double absNum2 = qAbs(num2);std::cout << "The absolute value of " << num1 << " is " << absNum1 << std::endl;std::cout << "The absolute value of " << num2 << " is " << absNum2 << std::endl;return a.exec();
}

2.qAsConst

原型:

template <typename T> typename std::add_const<T>::type &qAsConst(T &t)
template <typename T> void qAsConst(T&& t)

官方的解释:

  • 这个函数实现了C++17标准中的std::as_const()函数的功能,将一个非常量的左值转为常量的左值。
  • 增加qAsConst函数是为了Qt自己的非const 的容器能实现C++11标准的基于范围的循环。
  • 该函数主要用于qt容器在隐式共享中不被detach。

  最直观的的作用就是将一个对象转换为常量引用。在 C++ 里,如果你有一个非 const 对象,而你又希望在某些场景下把它当作 const 对象来使用(例如传递给一个只接受 const 引用的函数),qAsConst 就可以发挥作用。

        从上文的描述,我们知道下面的代码:

QString s = ...;
for (QChar ch : s) // detaches 's' (performs a deep-copy if 's' was shared)process(ch);

当s被修改时,将会导致s被detach,继而再执行深拷贝,而下面的代码s不会被detach,当然也就不会再执行深拷贝了

for (QChar ch : qAsConst(s)) // ok, no detach attemptprocess(ch);

当然,在这种情况下,你也许会说,像下面那样将s声明为const,也不会执被detach:

 const QString s = ...;for (QChar ch : s) // ok, no detach attempt on const objectsprocess(ch);

但是在编程时、在现实中,声明为const往往不容易做到。对Qt自己实现的容器如:QVector、QMap、 QHash、QLinkedList、QList等,如果一定要用基于for(var : container)范围的循环,则请用如下形式:

for(var : qAsConst(container))

3.qBound

原型:

template <typename T> const T &qBound(const T &min, const T &val, const T &max)

其功能是把一个值限定在指定的最小值和最大值范围内。当该值小于最小值时,它会返回最小值;当该值大于最大值时,它会返回最大值;若该值处于最小值和最大值之间,则直接返回该值。

在实际开发中,qBound 函数常用于以下场景:

  • 限制数值范围:当你要确保某个数值处于特定区间内时,可使用该函数。比如,调整音量、进度条等控件的值时,需要保证其在有效范围内。
  • 避免越界访问:在处理数组、列表等数据结构时,用 qBound 函数可防止索引越界。

示例如下:

#include <QCoreApplication>
#include <QVector>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QVector<int> numbers = {1, 2, 3, 4, 5};int index = 10;int validIndex = qBound(0, index, static_cast<int>(numbers.size() - 1));if (validIndex < numbers.size()) {qDebug() << "Value at index:" << numbers[validIndex];} else {qDebug() << "Index is out of bounds.";}return a.exec();
}

在这个例子中,index 的值为 10,超出了 numbers 向量的有效索引范围。qBound 函数会将 index 限制在 0 到 numbers.size() - 1 之间,避免了越界访问。

4.qConstOverload

原型:

template <typename T> auto qConstOverload(T memberFunctionPointer)

主要用于解决 C++ 中函数重载和信号槽连接时的类型推导问题,特别是在连接 const 和非 const 版本的重载函数时。

C/C++中重载函数取地址的方法_qt c++ 绑定重载信号-CSDN博客

示例如下:

#include <QCoreApplication>
#include <QObject>
#include <QDebug>class MyClass : public QObject
{Q_OBJECT
public:explicit MyClass(QObject *parent = nullptr) : QObject(parent) {}// 非 const 版本的重载函数void myFunction(int value) {qDebug() << "Non-const myFunction called with value:" << value;}// const 版本的重载函数void myFunction(int value) const {qDebug() << "Const myFunction called with value:" << value;}
};#include "main.moc"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);MyClass obj;const MyClass constObj;// 连接 const 版本的 myFunctionQObject::connect(&constObj, qConstOverload<int>(&MyClass::myFunction), [](int value) {qDebug() << "Slot called with value:" << value;});// 发送信号调用 const 版本的 myFunctionconstObj.myFunction(42);return a.exec();
}

5.qEnvironmentVariable

原型:

//该函数用于获取指定名称的环境变量的值。若环境变量存在,就返回其值;若不存在,则返回一个空字符串。
QString qEnvironmentVariable(const char *varName)//此函数同样是获取指定名称的环境变量的值。要是环境变量不存在,就返回指定的默认值。
QString qEnvironmentVariable(const char *varName, const QString &defaultValue)//通过 ok 变量判断转换是否成功。若成功,输出转换后的整数值;若失败,输出错误信息。
int qEnvironmentVariableIntValue(const char *varName, bool *ok = nullptr)//该函数用于检查指定名称的环境变量是否被设置。若已设置,返回 true;反之,返回 false。
bool qEnvironmentVariableIsEmpty(const char *varName)//此函数用于检查指定名称的环境变量是否为空。若为空(即变量存在但值为空字符串)或者变量未设置,返回 true;否则返回 false。
bool qEnvironmentVariableIsSet(const char *varName)

qEnvironmentVariable 是 Qt 中用于访问系统环境变量的一组函数。环境变量是操作系统中存储的键值对,可用于存储各种配置信息,像路径、系统设置等。在 Qt 程序里,你可以借助这些函数获取环境变量的值,以实现特定的配置或功能。

示例如下:

#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 获取 PATH 环境变量的值QByteArray pathValue = qEnvironmentVariable("PATH");if (!pathValue.isEmpty()) {qDebug() << "PATH environment variable:" << pathValue;} else {qDebug() << "PATH environment variable is not set.";}// 获取一个可能不存在的环境变量,并提供默认值QByteArray customValue = qEnvironmentVariable("MY_CUSTOM_VARIABLE", "default_value");qDebug() << "MY_CUSTOM_VARIABLE:" << customValue;// 检查环境变量是否设置bool isSet = qEnvironmentVariableIsSet("JAVA_HOME");qDebug() << "JAVA_HOME is set:" << isSet;// 检查环境变量是否为空bool isEmpty = qEnvironmentVariableIsEmpty("TEMP");qDebug() << "TEMP is empty:" << isEmpty;return a.exec();
}

6.qExchange

原型:

template <typename T, typename U> T qExchange(T &obj, U &&newValue)

其功能和标准库中的 std::exchange 类似,用于将一个对象的值替换为新值,并返回该对象的旧值。在 Qt 中使用 qExchange 可以简化代码逻辑,尤其在需要更新对象状态并保留旧值的场景中非常有用。

C++14之std::exchange的使用和原理分析-CSDN博客

qExchange 常用于以下场景:

  • 状态更新:在更新对象的状态时,需要保留对象的旧状态,以便后续使用。
  • 资源管理:在释放或转移资源时,需要返回旧资源的所有权。

示例如下:

#include <QCoreApplication>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int* oldPtr;int value1 = 10;int value2 = 20;int* ptr = &value1;// 使用 qExchange 更新 ptr 的值,并获取旧值oldPtr = qExchange(ptr, &value2);qDebug() << "Old pointer value:" << *oldPtr;qDebug() << "New pointer value:" << *ptr;return a.exec();
}

7.qFloatDistance

原型:

quint32 qFloatDistance(float a, float b)
quint64 qFloatDistance(double a, double b)

        返回a和b之间可表示的浮点数。
        此函数提供了一种类似于 qFuzzyCompare() 的浮点数近似比较的替代方法。但是,它返回两个数字之间的距离,这使调用者可以选择接受的错误。误差是相对的,例如1.0E-5和1.00001E-5之间的距离将为110,而1.0E36和1.00001-E36之间的距离为127。
        如果浮点比较需要一定的精度,则此函数很有用。因此,如果a和b相等,它将返回0。对于32位浮点数,它将返回的最大值是4278190078。这是-FLT_MAX和+FLT_MAX之间的距离。
        如果任何参数为Infinite或NaN,则函数不会给出有意义的结果。您可以通过调用qIsFinite()来检查这一点。
        返回值可以被视为“错误”,因此,如果你想比较两个32位浮点数,而你所需要的只是一个近似的24位精度,你可以这样使用这个函数:

if (qFloatDistance(a, b) < (1 << 7)) {   // The last 7 bits are not// significant// precise enough
}

8.qInstallMessageHandler

原型:

//格式化日志消息的函数
QString qFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &str);//安装日志钩子函数
void myMessageHandler(QtMsgType, const QMessageLogContext &, const QString &);
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler);

当你想要自定义日志输出的格式,比如添加时间戳、日志级别标识、文件和行号等额外信息时,就可以使用 qFormatLogMessage 函数。

示例如下:

#include <QCoreApplication>
#include <QDebug>
#include <QDateTime>
#include <QMessageLogContext>// 自定义日志消息格式化函数
QByteArray customFormatLogMessage(QtMsgType type, const QMessageLogContext &context, const QString &message)
{QString level;switch (type) {case QtDebugMsg:level = "DEBUG";break;case QtInfoMsg:level = "INFO";break;case QtWarningMsg:level = "WARNING";break;case QtCriticalMsg:level = "CRITICAL";break;case QtFatalMsg:level = "FATAL";break;default:level = "UNKNOWN";}QString timestamp = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");QString formattedMessage = QString("[%1] [%2] [%3:%4 %5] %6").arg(timestamp).arg(level).arg(context.file ? context.file : "").arg(context.line).arg(context.function ? context.function : "").arg(message);return formattedMessage.toUtf8();
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 设置自定义的日志消息处理函数qInstallMessageHandler([](QtMsgType type, const QMessageLogContext &context, const QString &message) {QByteArray formattedMessage = customFormatLogMessage(type, context, message);fprintf(stderr, "%s\n", formattedMessage.constData());});// 输出不同级别的日志消息qDebug() << "This is a debug message";qInfo() << "This is an info message";qWarning() << "This is a warning message";qCritical() << "This is a critical message";return a.exec();
}

1)自定义格式化函数 customFormatLogMessage:
        根据日志消息的类型 type 确定日志级别字符串 level。
        获取当前的时间戳 timestamp。
        利用 QString::arg 方法将时间戳、日志级别、文件路径、行号、函数名和日志消息内容组合成一个格式化的字符串 formattedMessage。
        将格式化后的字符串转换为 QByteArray 类型并返回。
2)设置自定义日志消息处理函数:
        使用 qInstallMessageHandler 函数设置一个自定义的日志消息处理函数,在该函数中调用customFormatLogMessage 对日志消息进行格式化,并将格式化后的消息输出到标准错误流。
3)输出不同级别的日志消息:
        使用 qDebug、qInfo、qWarning、qCritical 等宏输出不同级别的日志消息,这些消息会经过自定义的格式化处理后输出。

通过这种方式,你可以根据自己的需求灵活定制日志输出的格式。

http://www.xdnf.cn/news/2467.html

相关文章:

  • 软件模块依赖关系管理与优化
  • 基于 STM32 与 RFID 技术的医院医疗器械数字化精细管理系统设计
  • Redis内存管理三部曲:淘汰、过期与惰性删除的协同哲学
  • 01_Long比较值 类型相同值不同
  • 幂等性处理解决方案实战示例
  • MySQL 表的约束(一)
  • 第一个 servlet请求
  • 【看穿操控的套路】
  • 【记录maven依赖规则-dependencyManagement,dependencies】
  • Matlab 报错:尝试将 SCRIPT vl_sift 作为函数执行:
  • Java学习手册:Spring 框架核心概念
  • 如何通过OKR管理项目目标
  • 四 YARN配置和HBase配置
  • C++ 区分关键字和标识符
  • 职场提效小工具!
  • 【halcon】tuple_sort_index 和 select_obj 配合使用 详解
  • 小白学习python第四天
  • SpringBoot常用注解解析汇总
  • 基础学习:(9)vit -- vision transformer 和其变体调研
  • 03 基于 STM32 的温度控制系统
  • vscode eslint与vue-official冲突,导致点击的时候鼠标不会变成手型,一直在加载,但是不转到相应方法。
  • 二进制补码:给补码求原码
  • vue3中ref在js中为什么需要.value才能获取/修改值?
  • 智能文档抽取技术发展前沿与应用
  • Linux Socket编程:从API到实战
  • 模型删除层后重建
  • Go语言入门:目录与链接
  • EKS环境下服务重启50X错误
  • 企业架构之旅(1):TOGAF 基础入门
  • 【Arxiv 2025】Single Image Iterative Subject-driven Generation and Editing