Guix text_button 设置文字,报错 0x30

需求 需要设置 text_button 上面显示的文字的时候,报错 "GX_SYSTEM_MEMORY_ERROR : (0x30) 未定义内存分配器或内存分配失败。" 解决 分析 debug 仔细追查,发现 _gx_text_button_text_set_ext 这个函数里面会判断有没有设置 private text copy, 如果设置了,那么再检查有没有开启 _gx_system_memory_allocator, 如果没有,那么就会报错 0x30 了。 解决方法 有两种解决方法: 无 private text copy + 无 gx_system_memory_allocator_set(memory_allocate, memory_free), 会直接使用传入进去的字符串参数,只要传入进去的不是局部变量,就没有必要勾选 private text copy. 有 private text copy + 有 gx_system_memory_allocator_set(memory_allocate, memory_free), 也可以,会多复制一份数据。 参考 第 4 章 - GUIX 服务说明 {ThreadX全家桶} GUIX sample 错误–>gx_prompt_text_set_ext大坑,必须正确指定有效字符串长度才可以使用

2023-11-30 · 1 min · 56 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

Guix 是否使用显存方案选择

需求 使用 guix,是否需要显存? 显存需要多大? 解决 是否需要显存? gui 显示一般就是两种方式,直驱或者显存刷新。 直驱 直驱的意思是,程序中界面需要变化时,直接向显示设备中对应的区域写入新的数据。 好处是: 不需要显存,那里变化改那里。适合于 RAM 小的情况。 坏处是: 因为没有显存,所以在更新时经历这样的过程: 1. 先清除相关区域; 绘制背景; 3. 绘制前景. 这种多步骤的实现方式,加上小容量 RAM 一般 使用的是接口屏本身的速度限制,很容易会造成整体时间过长,人眼看上去容易有闪烁和撕裂的情况。也就是闪屏的情况。 显存 显存的意思是,程序中界面需要变化时,把需要更新的数据先更新到显存中,然后 gui 会一次把最终结果写入到屏幕。 好处是: 这种情况下屏幕更新需要的时间很短,只有直驱的 1/3,显示稳定,没有闪烁的情况。 坏处是: 需要 RAM 足够大,能够容纳整个屏幕,这样才能作为显示缓冲来工作。 总结 如果 RAM 够大,推荐显存方式,不闪屏,体验好。如果 RAM 小,屏幕小,用户对于显示效果不敏感,就可以使用直驱方案。 显存容量计算 显存占用的 RAM 计算方式: 屏幕长 * 屏幕宽 * 单个像素点字节数。 比如: 320 * 240 的屏幕,使用 16bit 位宽的像素,那么显存大小就是 320 * 240 * 16 / 8 = 153.6 kB. 并且使用 gui + 显存的方案,一般会搭配 DAM2D 来加快数据传输,包括新数据写入显存,以及显存通过 fmc 更新到屏幕。...

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

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)

2023-11-16 · 1 min · 134 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

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

2023-11-15 · 1 min · 163 words · RamLife

QT 应用图标

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

2023-11-14 · 1 min · 29 words · 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时注意事项

2023-11-14 · 1 min · 33 words · RamLife

QT 打印 pdf

需求 qt 需要打印 pdf 解决 简单的打印 pdf,可以使用 QPrinter. void Printer::Print(QPrinter *printer) { qDebug() << "Printer::Print"; QPainter *pPainter = new QPainter(printer); int page_border = 30 * line_ratio_; int nPdfWidth = pPainter->viewport().width(); int nPdfHeight = pPainter->viewport().height(); qDebug() << "pdf width: " << nPdfWidth << ", height: " << nPdfHeight; //绘制标题 int y = 10 * line_ratio_; int nLineHeight = 60 * line_ratio_; y = PrintInfo(pPainter, nPdfWidth, page_border, y, nLineHeight); qDebug() << "after PrintInfo y: " << y; y += 10 * line_ratio_; pPainter->drawLine(QLineF(page_border, y + 15 * line_ratio_, nPdfWidth - page_border, y + 15 * line_ratio_)); y += 30 * line_ratio_; y = PrintImage(pPainter, nPdfWidth, page_border, y, nPdfHeight * image_ratio_); qDebug() << "after PrintImage y: " << y; y = PrintTable(pPainter, nPdfWidth, page_border, y, nLineHeight); qDebug() << "after PrintTable y: " << y; delete pPainter; } int Printer::PrintInfo(QPainter *pPainter, int nPdfWidth, int page_border, int y, int nLineHeight) { pPainter->setFont(QFont("宋体", 18, QFont::Bold)); pPainter->drawText(QRect(0, y, nPdfWidth, 100), Qt::AlignCenter, tr(organization_name_....

2023-11-13 · 2 min · 312 words · 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()绘制多幅图片

2023-11-13 · 1 min · 49 words · RamLife