QT gui 单元测试高级部分

需求 qt 如何进行 gui 单元测试高级特性 解决 测试焦点 使用焦点时需要考虑的重要一点是,在小部件上简单地调用 QWidget::setFocus 将不起作用,因为在执行测试期间小部件不可见。我们需要做的是在我们正在测试的 QWidget 上调用静态函数 QApplication::setActiveWindow void TestPanelConcat::TestFocus() { // enables focus and widget events QApplication::setActiveWindow(&panel); // set initial focus panel.mInputA->setFocus(); QVERIFY2(panel.mInputA->hasFocus(), "Input A doesn't have focus"); // write STR1 QTest::keyClicks(QApplication::focusWidget(), STR1); // move focus to next widget QTest::keyClick(&panel, Qt::Key_Tab); QVERIFY2(panel.mInputB->hasFocus(), "Input B doesn't have focus"); // write STR2 QTest::keyClicks(QApplication::focusWidget(), STR2); // move focus to next widget QTest::keyClick(&panel, Qt::Key_Tab); QVERIFY2(panel.mButtonConcat->hasFocus(), "Button CONCAT doesn't have focus"); // press button CONCAT using space QTest::keyClick(QApplication::focusWidget(), Qt::Key_Space); QCOMPARE(panel....

<span title='2024-02-29 18:02:00 +0800 CST'>2024-02-29</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;220 words&nbsp;·&nbsp;RamLife

QT gui 单元测试简单部分

需求 qt 如何进行 gui 单元测试 解决 创建项目 别忘了勾选 gui 选项 获取访问权限 在需要测试的 widget 中需要增加友元类: class WIDGETSLIBSHARED_EXPORT PanelConcat : public QWidget { Q_OBJECT friend class TestPanelConcat; public: 基本测试 测试生成 测试有没有创建 widget void TestPanelConcat::TestConstruction() { QVERIFY2(panel.mInputA, "Input field A not created"); QVERIFY2(panel.mInputB, "Input field B not created"); QVERIFY2(panel.mLabelRes, "Result label not created"); } 测试重要属性 void TestPanelConcat::TestSize() { QVERIFY2(panel.minimumWidth() == PanelConcat::MIN_W, "Minimum width not set."); QVERIFY2(panel.minimumHeight() == PanelConcat::MIN_H, "Minimum height not set"); } 模拟简单使用 可以模拟鼠标和键盘,通过 keyClicks, mouseClick....

<span title='2024-02-23 17:45:00 +0800 CST'>2024-02-23</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;264 words&nbsp;·&nbsp;RamLife

QT cpp 单元测试高级部分

需求 qt 如何单元测试高级特性 解决 创建项目 new project -> other project -> subdirs project: 用于创建包含多个测试项目的父项目 new project -> other project -> qt unit test: 单个的测试项目,提供更多的选项 数据驱动 添加数据 在测试函数的后面添加 _data 后缀的同名私有槽函数,然后通过 QTest::addColumn 添加列, QTest::newRow 添加行. void TestCalculator::testDiff_data() { QTest::addColumn<int>("a"); QTest::addColumn<int>("b"); QTest::addColumn<int>("result"); QTest::newRow("all 0") << 0 << 0 << 0; QTest::newRow("same number") << 10 << 10 << 0; // ... more data ... } INDEX NAME a b result 0 “all 0” 0 0 0 1 “same number” 10 10 0 使用数据 使用 QFETCH 来提取数据...

<span title='2024-02-23 17:20:00 +0800 CST'>2024-02-23</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;247 words&nbsp;·&nbsp;RamLife

QT cpp 单元测试简单部分

需求 qt 如何进行单元测试 解决 创建项目 new project -> other project -> auto test project framework: Qt Test Gui Application: 是否需要测试 Gui Widget QApplication: 是否需要 QApplication 相关 Generate init and clean: 是否需要创建初始化和清理代码 初始化和清理 initTestCase() : 第一个测试函数之前被调用 initTestCase_data (): 创建一个全局测试数据表 cleanupTestCase (): 最后一个测试函数后被调用 init (): 每个测试函数之前被调用 cleanup (): 每个测试函数之后被调用 测试语句 一般用的比较多的就是 QVERIFY, QVERIFY2, QCOMPARE QVERIFY, 只能提示真假 QVERIFY2, 额外提供设定好的信息 QCOMPARE, 提供更为详细的报错说明 QVERIFY(c1.getA() == 0); QVERIFY2(c2.getA() == A, "first operand doesn't match"); QCOMPARE(mCalc.Sum(), A0 + B0); 测试类申明 QTEST_MAIN: 完整项目测试 QTEST_GUILESS_MAIN: 没有界面的测试 QTEST_APPLESS_MAIN: 没有界面,没有事件的测试 // full Qt application QTEST_MAIN(TestName) // core Qt application: no GUI, but event loop is available QTEST_GUILESS_MAIN(TestName) // no Qt application: no GUI and no events QTEST_APPLESS_MAIN(TestName) 如果申明的 cpp 文件没有对应的 h 文件,那么还需要在末尾额外包含信息:...

<span title='2024-02-23 17:00:00 +0800 CST'>2024-02-23</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;147 words&nbsp;·&nbsp;RamLife

QT mysql 连接远端数据库无法打开

需求 Qt生成的 release,经过 windeployqt 之后,放到另外一台机器上,但是打不开网络上面的 mysql 服务器。 解决 检查 mysql 是否安装 其实很简单,因为新机器上面没有 mysql 相关的可执行文件,在机器上安装 mysql 的 client 端即可解决这个问题。 检查源码是否配置正确 另外 qt 源码当中也需要检查 连接 mysql 的配置有没有问题: // 创建一个数据库连接 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName("your_mysql_server_ip"); // 替换为你的 MySQL 服务器 IP 地址 db.setDatabaseName("your_database_name"); db.setUserName("your_username"); db.setPassword("your_password"); 检查 mysql 服务端是否开启了网络帐号 mysql 只有创建了可以网络登陆的帐号,才可以通过网络连接过来。 参考 windows安装mysql client 命令行客户端

<span title='2024-02-20 19:04:00 +0800 CST'>2024-02-20</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;50 words&nbsp;·&nbsp;RamLife

QT 获取编译时间

需求 Qt 为了功能上的需要,需要获取软件编译的时间. 解决 qt 默认的编译时间,使用的是英文字符,类似 Feb 13 2024, 而且当日期小于 10 的时候,使用的还是单个字符,没有补 0. QString build_date = QString(__DATE__); // qDebug() << "build time: " << build_date; build_date.replace(" "," 0"); //注意" "是两个空格,用于日期为单数时需要转成“空格+0” QDate build = QDate::fromString(build_date, "MMM dd yyyy"); 参考 Qt 获取编译时间 Qt获取编译时间

<span title='2024-02-01 18:44:00 +0800 CST'>2024-02-01</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;41 words&nbsp;·&nbsp;RamLife

QT chart 更加清晰

需求 qt chart 在打印的时候,因为缩放的问题,导致图标不清晰,需要能够更加清晰一些。 解决 chart 其实主要就是几个部分: 曲线,坐标轴及文字,辅助线 曲线 主要就是加粗即可,使用 QPen, 修改 width 即可。 QPen pen; pen.setStyle(Qt::SolidLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine pen.setWidth(2); pen.setColor(Qt::red); series0->setPen(pen); //序列series0的线条设置 坐标轴 为了方便修改也使用 QPen QPen axis_pen; axis_pen.setStyle(Qt::SolidLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine axis_pen.setWidth(3); axis_pen.setColor(Qt::black); axisX->setLinePen(axis_pen); 辅助线 辅助线分为两种,一种是文字对应的辅助线,另外一种是文字之间的辅助线. QPen grid_pen; grid_pen.setStyle(Qt::DashLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine grid_pen.setWidth(2); grid_pen.setColor(Qt::darkGray); QPen minor_grid_pen; minor_grid_pen.setStyle(Qt::DotLine); //Qt::SolidLine, Qt::DashLine, Qt::DotLine, Qt::DashDotLine minor_grid_pen.setWidth(1); minor_grid_pen.setColor(Qt::darkGray); axisX->setGridLinePen(grid_pen); axisX->setMinorGridLinePen(minor_grid_pen); 坐标轴文字 文字一般就是两种方法: 加粗和加大 QFont axis_font = axisX->labelsFont(); axis_font.setBold(true); int axis_font_point_size = axis_font....

<span title='2024-02-01 18:34:00 +0800 CST'>2024-02-01</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;80 words&nbsp;·&nbsp;RamLife

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....

<span title='2024-01-14 18:44:00 +0800 CST'>2024-01-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;113 words&nbsp;·&nbsp;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....

<span title='2023-12-11 21:41:00 +0800 CST'>2023-12-11</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;100 words&nbsp;·&nbsp;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()

<span title='2023-12-02 21:41:00 +0800 CST'>2023-12-02</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;47 words&nbsp;·&nbsp;RamLife