Guix 移植

需求 使用 stm32cubeide 移植 guix 到 stm32u575 上面。 解决 简单界面设计 下载 guix studio 按照例子做个最简单界面 导出 resource 和 specification 源码 下载 guix studio 对应版本源码 把源码中的 common 整个文件夹放到工程中 把源码中的 port 中相应架构的 gx_port.h 放到工程中 开启 GX_INCLUDE_USER_DEFINE_FILE, 把 guix studio 的例子中的 gx_user.h 复制到工程中。 板级相关 在 port 文件夹中新增 gx_display_driver_rgb565_stm32u575 相关源文件和头文件。 在文件中新增: UINT GuixDriverSetupRgb565(GX_DISPLAY *display) { LcdInit(); _gx_display_driver_565rgb_setup(display, (VOID*)GUIX_SCREEN_HANDLE, GuixBufferToggleRgb565); display -> gx_display_driver_horizontal_line_draw = GuixHorizontalLineDirectDrawRgb565; display -> gx_display_driver_vertical_line_draw = GuixVerticalLineDirectDrawRgb565; display -> gx_display_driver_pixel_write = GuixPixelDirectWriteRgb565; display -> gx_display_driver_pixel_blend = GuixPixelDirectBlendRgb565; // display -> gx_display_driver_buffer_toggle = stm324xg_16bpp_buffer_toggle; display -> gx_display_handle = GUIX_SCREEN_HANDLE; return(GX_SUCCESS); } 新增上面相关的这些画点和线的函数。 线程 新增线程函数, 其中设置都是和 guix studio 导出的文件相关的。 GX_WINDOW *pScreen; GX_WINDOW_ROOT *root; void GuixMainEntry(ULONG thread_input) { (void)thread_input; gx_system_initialize(); // gx_system_memory_allocator_set(memory_allocate, memory_free); gx_studio_display_configure(PRIMARY, GuixDriverSetupRgb565, LANGUAGE_ENGLISH, PRIMARY_THEME_1, &root); gx_studio_named_widget_create((char *)"Button_Screen", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen); gx_widget_show(root); gx_system_start(); while (1) { tx_thread_sleep(20); } } 把线程函数添加到启动线程中即可。 参考 {ThreadX全家桶} ThreadX GUIX直驱方案搞定,任何显示屏,低资源的MCU都可以跑了,不再需要画布,附工程下载 {ThreadX全家桶} 第3版emWin教程和ThreadX GUIX教程开工,双管齐下,GUIX更新至第30章,emWin更新至第57章(2022-04-04)

<span title='2023-11-16 16:32:00 +0800 CST'>2023-11-16</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;134 words&nbsp;·&nbsp;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数据库中日期字段问题

<span title='2023-11-16 10:18:00 +0800 CST'>2023-11-16</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;61 words&nbsp;·&nbsp;RamLife

QT 使用mysql,提示 QSqlDatabasePrivate::database: requested database does not belong to the calling thread.

需求 qt 使用 mysql 的时候,提示: QSqlDatabasePrivate::database: requested database does not belong to the calling thread. 解决 使用 QSqlQuery 的时候,指明数据库连接。 int DataBaseProcess::ConnectDataBase(QSqlDatabase& db, const QString& name) { // if (db_.open()) { // return 1; // } qDebug() << "ConnectDataBase: " << name; if (QSqlDatabase::contains(name))//判断testConnect连接是否存在并连接 { db = QSqlDatabase::database(name); } else //未连接则新建数据库连接 { // QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db = QSqlDatabase::addDatabase("QMYSQL", name); db.setHostName("localhost"); // 设置数据库服务器地址 db.setPort(3306); db.setDatabaseName("ke_db"); // 设置数据库名 db.setUserName("root"); // 设置数据库用户名 db....

<span title='2023-11-15 10:18:00 +0800 CST'>2023-11-15</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;163 words&nbsp;·&nbsp;RamLife

QT 应用图标

需求 qt 需要设置应用图标替换默认的图标 解决 创建 rc 文件 项目目录新建文本文件 在文件中输入: IDI_ICON1 ICON DISCARDABLE "Icon/test1.ico" 修改文件名为: “项目名称”.rc 使用 rc 文件 项目.pro 文件中,加上 RC_FILE = IconTest.rc, 注意替换 rc 文件项目名称。 参考 Windows下QT设置应用程序(exe)图标、任务栏托盘图标、任务栏窗口图标 Qt学习之自定义修改exe应用程序图标(超简单)

<span title='2023-11-14 11:43:00 +0800 CST'>2023-11-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;29 words&nbsp;·&nbsp;RamLife

QT 写入 mysql 中字段为 null,并读取可能为 null 的字段

需求 使用 qt 使用 mysql 的时候,某些字段可能为 null,那么如何写入?读取时如何判断? 解决 写入 写入比较简单,明文说明是 null 即可. query.exec(QString("update rfid_match set RFID2=null where WZSFM='%1'").arg(model->item(modelReIndex,4)->text())); 读取 读取时候,需要使用 isNull 判断是否为 null。 QSqlRecord::isNull QVariant::isNull 参考 Qt中SQL语句update同时更新多字段及设置字段值为空的方法 Qt数据库SQL语句绑定方式与插入空值 C++Qt开发——操作MySQL数据库 Qt: QSqlRecord字段值为null时注意事项 Qt: QSqlRecord字段值为null时注意事项

<span title='2023-11-14 10:18:00 +0800 CST'>2023-11-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;33 words&nbsp;·&nbsp;RamLife

QT 显示多图片

需求 qt 显示多张 pixmap 解决 图片多了之后,需要耗费更多的资源。 QLabel + setPixmap: 简单,但是使用 cpu 资源 drawPixmap: 直接使用 gpu 资源 QPixmap image1; image1.load(":/images/chuyin1.jpg"); void PaintWidget::paintEvent(QPaintEvent *) { //void QPainter::drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap) QPainter painter(this); int x1 = ui->view1Frame->pos().x(); int y1 = ui->view1Frame->pos().y(); painter.drawPixmap(x1,y1,ui->view1Frame->width(),ui->view1Frame->height(),image1); } 参考 【Qt】使用QPainter的drawPixmap()绘制多幅图片

<span title='2023-11-13 11:43:00 +0800 CST'>2023-11-13</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;49 words&nbsp;·&nbsp;RamLife

QT chart 转 图片

需求 qt 需要把 chart 曲线转为 pixmap 解决 这个其实很简单,直接调用 api 即可。 printer_.SetPixmap(test_chart_->get_view()->grab()); pPainter->drawPixmap(image_border, y, pixmap_); QPixmap p = view->grab(); QImage image = p.toImage(); image.save("chart.png"); 参考 Qt中将QChart图像导出成图片的问题 求助求助!!!QChart 图表转到QPixmap 如何将Qt窗口的内容转化为图片?

<span title='2023-11-13 10:43:00 +0800 CST'>2023-11-13</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;28 words&nbsp;·&nbsp;RamLife

QT 使用 QTableView 和 QSqlQueryModel 配合显示数据

需求 qt 中需要从数据库中搜索数据,并在表格中显示 解决 设置 view_ = new QTableView(this); query_model_ = new QSqlQueryModel(this); selection_model_ = new QItemSelectionModel(query_model_, this); view_->setModel(query_model_); view_->setSelectionModel(selection_model_); view_->setEditTriggers(QAbstractItemView::NoEditTriggers); view_->setSelectionMode(QAbstractItemView::SingleSelection); view_->setSelectionBehavior(QAbstractItemView::SelectRows); view_->setAlternatingRowColors(true); 搜索并显示 QString query_command = "SELECT q.`flag_check`, q.`strip_id`, q.`analysis_datetime`, q.`ip`, q.`analysis_id`, qt.`name`, " "r.`type`, q.`value_fix`, q.`value_act_fix`, q.`value_cr_fix`, " "q.`reference_range`, q.`quality_no`, " "(CASE WHEN q.`flag_normal` = 0 THEN '不通过' " "WHEN q.`flag_normal` = 1 THEN '通过' " "ELSE '不通过' END), q.`device_sn` " "FROM (quality AS q inner join quality_type AS qt ON q....

<span title='2023-11-12 10:18:00 +0800 CST'>2023-11-12</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;159 words&nbsp;·&nbsp;RamLife

__attribute__((weak)) 修饰的函数没有被覆盖

需求 定义了同名函数后,原来的 __attribute__((weak)) 修饰的函数并没有被覆盖 ? 解决 打开生成的 map 文件,经过搜索,只找到了原来的函数,并没有找到新定义的函数。 在头文件中增加了新定义函数的声明 int _write(int file, char *ptr, int len);, 重新编译后,打开 map 文件,就可以找到新定义的函数了。 所以这个问题还是因为没有在头文件中声明,导致 printf 再调用的时候,只找到了弱定义的 write. 参考 ARM 之十一__weak 和 attribute((weak)) 关键字的使用 弱符号_attribute_((weak))

<span title='2023-11-10 14:36:00 +0800 CST'>2023-11-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;31 words&nbsp;·&nbsp;RamLife

QT 中 QByteArray 介绍

需求 QByteArray 有哪些常用方法? 解决 访问 [], data[]: 可读可写 at(), constData[]: 只读 增删改查 append, prepend: 后加,前加 replace: 替换 remove: 删除 indexOf, lastIndexOf: 搜索 转换 hex 和 字符串互转 QByteArray text = QByteArray::fromHex("517420697320677265617421"); text.data(); // returns "Qt is great!" QByteArray ba; ba.resize(3); ba[0] = 0x30; ba[1] = 0x31; ba[2] = 0x32; qDebug() << ba.toHex(); //return "303132" 数值转字符串 int n = 63; qDebug()<<QByteArray::number(n); // returns "63" qDebug()<<QByteArray::number(n, 16); // returns "3f" qDebug()<<QByteArray::number(n, 16).toUpper(); // returns "3F" qDebug()<<QByteArray::number(n, 2); // returns "111111" qDebug()<<QByteArray::number(n, 8); // returns "77" QByteArray ba; int n = 63; ba....

<span title='2023-11-07 10:18:00 +0800 CST'>2023-11-07</span>&nbsp;·&nbsp;2 min&nbsp;·&nbsp;275 words&nbsp;·&nbsp;RamLife