linux 和 windows 的 Gui 区别介绍

需求 了解 linux 和 windows 的 gui 大概的区别 解决 90年代 windows: gdi32.dll linux: x 普通情况都是使用 cpu 渲染 -> 显存 -> 显卡适配器 -> vga. 游戏都是 DirectX / OpenGL -> GPU -> 显存… vista 年代 windows: GDI+ -> Direct2D -> GPU Linux: AIGLX(X) -> OpenGL -> GPU 都是可以直接用 GPU,走的以前游戏这条路。 现在 windows: 小改动 win32k.sys, DirectX Linux: Wayland 替代 X, Vulkan 可能替代 OpenGL 参考 Linux 为何不把图形用户界面写入内核? - 12345的回答 - 知乎

<span title='2024-05-03 16:32:00 +0800 CST'>2024-05-03</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;66 words&nbsp;·&nbsp;RamLife

Java 对数 log 计算

需求 java 中对数 log 如何计算? 解决 直接使用 Math.log 即可,唯一需要注意的是 底数是多少? 自然对数 e double x = Math.log(10); 底数 10 double x = Math.log10(100); 其他底数 数学换底公式: logx(y) = ln(y) / ln(x) 库函数: public class Logarithm { public static double log(double value, double base) { return Math.log(value) / Math.log(base); } } 计算以33为底27的对数: public static void main(String[] args) { double log = log(27, 33); System.out.println(log); } private static double log(double value, double base) { return Logarithm....

<span title='2024-04-06 10:37:00 +0800 CST'>2024-04-06</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;77 words&nbsp;·&nbsp;RamLife

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

matplot 双X轴和辅助线

需求 使用 matplot 时,需要使用顶部的 X 轴,并且添加两个 X 轴的辅助线 解决 双X轴可以使用 twiny, 辅助线可以使用 MultipleLocator !/usr/bin/python3 import matplotlib.pyplot as plt import numpy as np from matplotlib.ticker import MultipleLocator, FormatStrFormatter sin_num = 2 x = np.linspace(0, 50, 150) y_ok = np.sin(x / sin_num) * 3 + 6 y1 = y_ok[ : 120] y2 = y_ok[ : 120] x_1 = x[ : 120] #x2 = np.linspace(0, 30, 120) fig, axes = plt.subplots() fig.set_size_inches(10, 5) axes....

<span title='2024-02-21 18:36:00 +0800 CST'>2024-02-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;194 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

STM32 IAP 使用 uart, ymodem

需求 需要在 STM32 芯片上,使用 uart 接口,通过 ymodem 协议,进行 IAP 升级。 解决 想用 IAP 升级,芯片上的程序需要分为两个部分,bootloader 和 app. 上位机需要一个软件通过接口,把新版本的软件发送给芯片。 bootloader bootloader 可以参考 STM32 提供的 IAP demo 进行修改。其中写 flash 的地方需要注意,不同芯片支持的写 flash 不一样,主要是支持的单次写入长度不一样,那么相关的写入次数等等都要跟着修改。 app app 部分需要改动的比较少,主要是两个地方: link: 这里需要修改 flash 起始地址,需要和 bootloader 中最后跳转的地址一致。gcc 编译器在 ld 文件中修改。 中断向量: VECT_TAB_OFFSET 也需要修改为新地址对应的偏移。 上位机 上位机软件最简单的就是使用 windows 自带的超级终端 hypertrm. 当然也可以自己写一个支持 YMODEM 协议的软件。 参考 串口YMODEM实现IAP程序升级(附完整工程) STM32 + IAP + Ymodem完美结合 YMODEM协议简介 {Windows} 网工必备:超级终端中文版及3CDaemon汉化版 STM32 IAP升级固件 + 上位机 例程 STM32中断向量表的偏移量设置方法 STM32单片机实现Bootloader跳转的关键步骤 【STM32+cubemx】0024 HAL库开发:IAP(在应用编程)的实现 STM32 用cubemx移植IAP功能,实现串口升级 STM32CubeIDE IAP原理讲解,及UART双APP交替升级IAP实现 【经验分享】STM32_IAP详解(有代码,有上位机) STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决

<span title='2024-02-06 14:19:00 +0800 CST'>2024-02-06</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;81 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