第一代软件开发(二)

简介: 欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资

头图

第一代软件开发(二)

[toc]

关键字: QtQmlQSerialPortQPixmapQSoundEffect

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏更新到第三代软件开发时将转为收费专栏

界面布局

image-20230707222542339

如上图所示,整个软件布局基本就是汉堡结构,上中下,左中右结构,有了这些,就构成了这个软件的基本操作逻辑了,这个也是咱充前辈那里面借鉴学习来的。最上面就是主菜单按钮,软件系统名称,主要功能选择Tab,编辑病历按钮。设备状态按钮和帮助按钮。中间从左到右为主菜单按钮,快捷功能栏,快捷功能菜单,中心曲线显示区域,两个控制模块,一个光学模块和一个预留模块以及病人编辑模块。最下方及时基本的状态栏,从左到右基本为软件版本,U盘插入图标和系统时间。

那么剩下的工作就是完善这些功能以及子模块了。

功能完善

因为第一代已经是好久的事情了,所以咱们这里基本就是把基本的框架聊聊,直接带带功能点咱就过了哈。重点还是研究咱第三代的东西。

快照功能

为什么不叫截图呢,因为在我理解看来,截图是可以鼠标截取任意位置的像素保存成图片的,而目前我们的功能就只把指定区域的像素保存成图片再往细了说就是把某个控件保存成图片。直接上代码

void MainWindow::snapshot()
{
    //    mMonitor_kernel_1->setMode(1);
    //    mMonitor_kernel_2->setMode(1);
    mPix = new QPixmap(ui->widget_monitor->grab(QRect(0,0,ui->widget_monitor->width(),ui->widget_monitor->height())));                                  // 获取谁的RGB
    QString filePathName = "./temp/";
    /**
     *
     * 这里需要增加参数字段
     */
    filePathName += QDateTime::currentDateTime().toString("hhmmsszzz");
    filePathName += ".png";
    if(!mPix->save(filePathName,"png"))
    {
        qDebug()<<"病历快照保存失败";
    }
    mReport_Kernel->inseartPic(filePathName);
    //    mMonitor_kernel_1->setMode(0);
    //    mMonitor_kernel_2->setMode(0);
}

获取可用串口

因为串口咱用的就是Qt 提供的QSerialPort类,那些基本设置咱就不说了,百度一大堆了,咱说下我们业务中的一个需求,获取可用的串口,并进行自动连接。

代码如下

void XXXXX::getAvailableSerialPort(QStringList &comlist)
{
    /**
     * 01 先清空设备列表
     */
    comlist.clear();
    /**
     * 02 遍历设备数,查找符号条件的串口
     * 这里感觉比较耗时,取决于当前设备上串口数量
     */
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if((QString::compare(info.description(),&COM_Description,Qt::CaseSensitive) == 0))
        {
            if(serial.open(QIODevice::ReadWrite))
            {
                comlist.append(info.portName());
                serial.close();
            }
        }
    }
    /**
     * 03 根据串列表中的数量,进行不同的处理
     * 如果有且仅有一个设备,则直接进行连接
     * 如果有多个,这需要通过协议握手,来确定设备
     */
    if(!comlist.isEmpty())
    {
        if(comlist.count() == 1)
        {
            if(flag_AutoConnectSerialPort)
                openSerialPort(comlist.at(0));
        }
        else
        {
            /**
             * 这里应该是当设备列表里面有多个 CH340 串口设备时,通过一个握手函数,连确定那个设备时真整的设备
             * 暂时应该还遇不到,不做处理,当遇到多个设备,默认连接第一个
             */
            openSerialPort(comlist.at(0));
            qDebug() << "两个以上同名设备,默认就链接第一个接口" << LOGINFOR;
        }
        qDebug() << "手柄链接成功"<< LOGINFOR;
        if(mAutoConnectTimer)
            if(mAutoConnectTimer->isActive())
                mAutoConnectTimer->stop();
    }
    else
    {
        emit signal_Serial_NoAvailableDevicesFound();
        if(mAutoConnectTimer)
            if(!mAutoConnectTimer->isActive())
                mAutoConnectTimer->start(30);
    }
}

播放按键提示音

正式项目中,咱学聪明了哈,不在用QMediaPlayer来播放提示音了,而是用了QSoundEffect,用法和QMediaPlayer没啥差别,代码如下

void XXXX::slot_InitAudioThread()
{
    soundEffect = new QSoundEffect;
    soundEffect->setSource(QUrl("qrc:/T_Audio/systemStart.wav"));
    soundEffect->setLoopCount(1);
    soundEffect->play();

    soundEffectButton = new QSoundEffect;
    soundEffectButton->setSource(QUrl("qrc:/T_Audio/buttonTach.wav"));                                  // 这里使用QSoundEffect的时候,对wav的码率有要求,测试192是没有问题
    soundEffectButton->setLoopCount(1);

    soundEffectBee = new QSoundEffect;
    soundEffectBee->setSource(QUrl("qrc:/T_Audio/bee.wav"));
    soundEffectBee->setLoopCount(1);
}

博客签名2021

相关文章
|
Dubbo Java 应用服务中间件
从源码全面解析 dubbo 服务端服务调用的来龙去脉
从源码全面解析 dubbo 服务端服务调用的来龙去脉
|
SQL 数据库 Windows
若依代码生成详细教程
我觉得若依官方的代码生成教程过于简单,网上的教程很多连个效果图都没有。 本文要达到的效果如下:[学生管理] 下有个 [学生信息] 菜单,里面可以增删改查。
6106 0
若依代码生成详细教程
|
12月前
|
机器学习/深度学习 边缘计算 人工智能
深度学习在图像处理中的应用与挑战
本文旨在探讨深度学习技术在图像处理领域的应用及其面临的主要挑战。通过分析深度学习模型如卷积神经网络(CNN)在图像分类、目标检测和图像分割等任务中的表现,揭示了其在提高精度、自动化特征提取方面的巨大潜力。同时,本文指出了当前深度学习在图像处理中的数据需求、计算资源消耗、模型解释性以及对抗攻击等方面的挑战,并提出了可能的解决方向。通过综合讨论,本文强调了深度学习在推动图像处理技术进步中的重要作用,同时也呼吁更多的研究以克服现有挑战,进一步拓宽其应用前景。
|
6月前
|
存储 弹性计算 Linux
阿里云服务器的【数据盘】是什么意思?必须买数据盘吗?
阿里云服务器的数据盘是独立于系统盘的存储空间,用于存放用户数据、日志等非系统文件,可根据需求选择是否购买。数据盘类型包括ESSD云盘、ESSD AutoPL等,性能与价格各异,适合不同业务场景。系统盘为必需品,而数据盘则可按需添加,支持挂载至ECS实例并初始化后使用。收费模式有按量付费和包年包月,具体价格因盘型和地域而异。了解更多可参考阿里云块存储官方文档。
|
人工智能 自然语言处理 Serverless
阿里云百炼应用实践系列-让微信公众号成为智能客服
本文主要介绍如何基于阿里云百炼平台快速在10分钟让您的微信公众号(订阅号)变成 AI 智能客服。我们基于阿里云百炼平台的能力,以官方帮助文档为参考,让您的微信公众号(订阅号)成 为AI 智能客服,以便全天候(7x24)回应客户咨询,提升用户体验,介绍了相关技术方案和主要代码,供开发者参考。
970 9
阿里云百炼应用实践系列-让微信公众号成为智能客服
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
|
10月前
|
存储 缓存 Oracle
Java线程池,白话文vs八股文,原来是这么回事!
本文介绍了Java线程池的原理、实现方式及相关参数。首先,通过类比公司员工的方式解释了线程池的核心概念,如核心线程、最大线程数、任务队列和拒绝策略。接着,详细描述了线程池的任务处理流程,并提供了使用`ThreadPoolExecutor`和`Executors`创建线程池的代码示例,强调了`ThreadPoolExecutor`的灵活性和`Executors`的局限性。最后,总结了线程池的相关参数及不同类型的线程池实现,并附带常见面试题及其解答,帮助读者全面理解线程池的应用场景和优化方法。
130 4
|
机器学习/深度学习 人工智能 算法
GitHub星标破千!斯坦福大学的284个机器学习小抄(漫画中文版)
说到人工智能必然要了解机器学习,从信息化软件,到电子商务,然后到高速发展互联网时代,到至今的云计算、大数据等,渗透到我们的生活、工作之中,在互联网的驱动下,人们更清晰的认识和使用数据,不仅仅是数据统计、分析,我们还强调数据挖掘、预测。 机器学习就是对计算机一部分数据进行学习,然后对另外一些数据进行预测与判断。 机器学习的核心是”使用算法解析数据,从中学习,然后对新数据作出决定或预测”。也就是说计算机利用已获取的数据得出某一模型,然后利用此模型进行预测的一种方法,这个过程跟人的学习过程有些类似,比如人获取一定的经验,可以对新问题进行预测。
GitHub星标破千!斯坦福大学的284个机器学习小抄(漫画中文版)
|
机器学习/深度学习 数据采集 算法框架/工具
使用Python实现深度学习模型:智能人力资源管理与招聘
【8月更文挑战第12天】 使用Python实现深度学习模型:智能人力资源管理与招聘
432 2
|
网络协议 C语言
C语言 网络编程(十)TCP通信创建流程---客户端
在TCP通信中,客户端需通过一系列步骤与服务器建立连接并进行数据传输。首先使用 `socket()` 函数创建一个流式套接字,然后通过 `connect()` 函数连接服务器。连接成功后,可以使用 `send()` 和 `recv()` 函数进行数据发送和接收。最后展示了一个完整的客户端示例代码,实现了与服务器的通信过程。