QT 构造函数中,检查配置文件,有问题就退出程序

需求 Qt 需要检查配置文件中的内容,如果有问题,就退出程序 解决 一般检查配置文件,是在构造函数环节,这个时候普通的退出是不行的。只能使用 QTimer 然后连接 qApp->quit() 来退出。 QSettings* configIni = new QSettings(file_path, QSettings::IniFormat, this); server_ip_ = configIni->value("ip", "192.168.1.100").toString(); server_port_ = configIni->value("port", "6666").toInt(); if (CheckServerIpAndPort(server_ip_, server_port_) == false) { QTimer *myTimer = new QTimer(); myTimer->start(10); connect(myTimer, &QTimer::timeout, this, [=](){this->close(); qApp->quit();}); } configIni->endGroup(); bool MainWindow::CheckServerIpAndPort(const QString &ip, uint16_t port) { QStringList list = ip.split('.'); if (list.size() != 4) { QMessageBox::critical(this, "IP格式错误", "请重新配置IP"); return false; } for (auto& s : list) { int address = s....

2024-01-14 · 1 min · 113 words · RamLife

c++ reserve, resize 区别

需求 cpp 里面的容器,reserve() 和 resize() 使用时有什么区别? 解决 reserve 只是增加了 capacity,没有增加 size; resize 增加了 capacity 和 size reserve 增加的容量里面没有相应的对象。resize 增加的是实实在在的对象,可以直接通过 at 来使用的。 参考 C++ vector中resize()和reserve()区别

2024-01-01 · 1 min · 24 words · RamLife

c/c++ string 的 length(), size(), strlen() 区别

需求 c/cpp 字符串长度,使用 length(), size(), strlen() 结果区别? 解决 strlen() 会查找 string 中的 ‘\0’,如果找到了,那么就是结束 length() 和 size() 其实一样,都是 string 实际的长度,不管其中是否有 ‘\0’ 参考 C++ string 成员函数 length() size() 和 C strlen() 的区别

2023-12-31 · 1 min · 30 words · RamLife

c/c++ 实现 _gettimeofday

需求 c/cpp 在一些嵌入式应用中,使用 time() 时,编译会报警告 warning: _gettimeofday is not implemented and will always fail 解决 这个警告的原因其实是因为,嵌入式环境中,有些是没有实现 _gettimeofday(), 所以就需要自己来实现这个函数,实现从 rtc 时间到秒之间的转换。 int _gettimeofday(struct timeval *tv, struct timezone *tz) { Rtc::Date date; Rtc::Time time; Rtc::GetRtcValue(date, time); tm time_tm {time.second, time.minute, time.hour, date.day, date.month - 1, date.year - 1900}; time_t time_second = mktime(&time_tm); tv->tv_sec = time_second; tv->tv_usec = 0; // tz->tz_minuteswest = 480; // tz->tz_dsttime = DST_NONE; return 0; } 参考 _gettimeofday_r error come while i am building with latest stm cube ide STM32 之 时间戳的解析与生成 STM32CubeMX使用(六)之RTC及制作时间戳 mktime很慢就自己去实现一个吧 linux几种时间函数总结 时间获取相关函数mktime()、gmtime() 【c/c++】linux时间获取与时间转换函数总结 杂谈:Linux时间管理之gettimeofday实现 gettimeofday()函数的使用方法 linux中time, ctime, gmtime, localtime, gettimeofday和strftime C语言的时间函数(1)gettimeofday,timeval,timezone linux系统中struct timeval结构体、struct timezone结构体以及gettimeofday函数 C 标准库 - <time....

2023-12-30 · 1 min · 139 words · RamLife

c/c++ 实现 calendar

需求 c/cpp 在一些嵌入式应用中,需要自己来实现对输入日期的校验和星期几的计算。 解决 日期校验还好说,主要是闰年的判断。 星期几的计算就比较麻烦了,一般是使用蔡勒公式。 蔡勒公式 1582年10月4日之后 w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 1582年10月4日或之前 w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 + 5) % 7 解释: w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 c:世纪(注:一般情况下,在公式中取值为已经过的世纪数,也就是年份除以一百的结果,而非正在进行的世纪,也就是现在常用的年份除以一百加一;不过如果年份是公元前的年份且非整百数的话,c应该等于所在世纪的编号,如公元前253年,是公元前3世纪,c就等于-3) y:年(一般情况下是后两位数,如果是公元前的年份且非整百数,y应该等于 cMOD100+100) m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算) d:日 示例 [ ]代表取整,即只要整数部分。...

2023-12-15 · 3 min · 575 words · RamLife

QT QJson 使用

需求 Qt 如何使用 QJson 解析 json 解决 int NetworkDataParse::Parse(const QByteArray& data, QJsonObject& obj) { QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(data, &error); if (doc.isNull()) { return -1; } obj = doc.object(); int type = obj.value("type").toString().toInt(); // QJsonValue type_value = obj.value("type"); // QString type_string = type_value.toString(); // qDebug() << "Parse: " << type_string << ", " << type; // switch (type) { // case kTypeAlive: // return ParseAlive(obj); // break; // default: // break; // } // return 0; return type; } 参考 Qt平台下使用QJson解析和构建JSON字符串 Qt 学习之路 :使用 QJson 处理 JSON JSON Support in Qt QJson的生成和解析 QJson读取及写入 使用fastjson解析JSON数据 QJsonArray....

2023-12-11 · 1 min · 100 words · RamLife

QT5 升级到 Qt6, QRegExp 不能用

需求 Qt5 的工程升级到 Qt6 之后,找不到 QRegExp 等一系列类。 解决 QRegExp -> QRegularExpression QRegExpValidator -> QRegularExpressionValidator // Qt5 QRegExp version(QLatin1String("(.+)_v(\\d+)")); if (version.exactMatch(completeBaseName/*QString*/)) { // some code } // Qt6 QRegularExpression version(QLatin1String("(.+)_v(\\d+)")); QRegularExpressionMatch match = version.match(completeBaseName); if (match.hasMatch()) { // Find exact match or not } 参考 QT6找不到QRegExpValidator类问题解决办法 关于QRegExpValidator头文件不存在的问题 Qt6中的端口QRegExp::exactMatch()

2023-12-02 · 1 min · 47 words · RamLife

c++ 成员变量初始化推断数组大小

需求 cpp 发现直接使用 const char str[] ="test"; 作为成员变量,编译会报错: error: array bound cannot be deduced from an in-class initializer. 解决 这个报错的原因是,作为成员变量,可能会被构造函数中的 类内初始化列表重新初始化。比如: Foo() : str({'a','b', 'c', 'd'}) {} // str ="abcd0". 所以,如果这个成员变量本身是不变的情况,可以使用 constexpr 这个关键字, static constexpr char str[] ="test"; 这样,变成类变量。 参考 关于c ++:不能从成员变量的初始化字符串中推断出数组大小的原因是什么? C++11关键字constexpr看这篇就够了

2023-11-30 · 1 min · 43 words · RamLife

stm32 cube ide 编译提示 undefined reference to

需求 编译的时候,提示 undefined reference to 解决 这种问题经常会碰到,一般就是相关源文件没有在编译列表里面,结果经过仔细查找,都添加进去了。后来经过仔细查找,发现原来是 c++ 和 c 混合编译的问题,在 c++ 中文件里面调用的函数,其所在的头文件没有使用 extern "C" 包含,导致的。想要修改也很简单,不需要改动头文件,只需要在 c++ 文件中这样: #include "gx_api.h" extern "C" { #include "gx_display.h" } 而且其实在 map 文件中是有相关线索的,下面分别是没有用 extern 包含,和用了 extern 包含的 map 文件中的函数信息。可以明显看到有 extern 包含的,有相关地址。 .text._gx_display_driver_565rgb_setup 0x0000000000000000 0x260 ./guix/common/src/gx_display_driver_565rgb_setup.o .text._gx_display_driver_565rgb_setup 0x000000000801e6e8 0x260 ./guix/common/src/gx_display_driver_565rgb_setup.o 0x000000000801e6e8 _gx_display_driver_565rgb_setup 参考 gcc “undefined reference to” 问题解决方法

2023-11-17 · 1 min · 53 words · RamLife

QT mysql 里面的日期时间和 QDateTime 转换

需求 qt 使用 mysql 的时候,日期时间格式和 QDateTime 互相转换 解决 QDateTime 转 mysql 时间格式 QDateTime dateTime = QDateTime(QDate(2024, 5, 3), QTime(22, 0, 0)); QString dateTimeString = dateTime.toString("yyyy-MM-dd HH:mm:ss"); // 转换为 MySQL 理解的格式 QString insertQuery = "INSERT INTO version (version_no, version_datetime) VALUES (:version_no, :version_datetime)"; // 执行 SQL 插入语句 // QSqlQuery query; query.prepare(insertQuery); query.bindValue(":version_no", 3); query.bindValue(":version_datetime", dateTimeString); mysql 时间格式转 QDateTime data.time = query.value("analysis_datetime").toDateTime(); 参考 QT读取服务器mysql数据库中日期字段问题

2023-11-16 · 1 min · 61 words · RamLife