一、导读 把焦点回到Qt应用开发中,一般情况下,Qt应用程序的本体由main.cpp文件中的main()函数中内容描述:#include <QApplication>#include "mainwindow.h"int main(int argc, char *argv[]){ QApplication app(argc, argv); MainWindow window; window.show(); return app.exec();}在上述代码中,创建了一个QApplication实例和MainWindow实例,MainWindow实例表示主窗体应用,QApplication正是本文的描述对象,她是QWidget的“地基”。QApplication是专门的QGuiApplication,它具有一些基于QWidget应用程...
一、导读 在实际开发中,Qt中很多类可以直接作为函数参数传递,这是为什么?其背后的实现机制又是什么?这些都归功于隐式共享,本文基于Qt 5.15源码,来聊聊隐式共享!二、隐式共享简介 Qt中的许多C++类使用隐式数据共享来提高资源使用并减少数据复制。当这些类作为参数传递时,因为只传递一个指向数据的指针,并且只有当函数写入数据时数据才会被复制,即copy -on-write,隐式共享类是安全、高效的。 共享类由一个指向包含引用计数和数据的共享数据块的指针组成。 当创建共享对象时,它将引用计数设置为1。每当有新对象引用共享数据时,引用计数就...
在《》一文中已经描述了Qt的信号和槽函数机制,在实际项目开发中,一般会使用QObject下提供的接口函数创建信号和槽函数之间的关联:但是在Qt Designer中提供了一个快速关联信号和槽函数的方式:使用『转到槽...』对话框创建选定控件之间的信号和槽函数关联。在点击『转到槽...』选项后,会弹出一个编辑框,例如此处以QPushButton按钮控件为例,则会弹出如下的对话框:从上图可知,首先QObject和QWidget下的信号是公共的,QAbstractButton是按钮类独有的,Qt使用该类抽象出了按钮的一些公共操作,并已定义好具体的信号。当选中具体信号后,点击“确...
一、信号和槽函数机制简介(注1:下文中的槽与槽函数表示一个意思)(注2:阅读本文可能有点枯燥,但文中有关于信号和槽的重要知识,这些知识甚至在开发中经常被忽略。请君继续下看)信号和槽用于多个对象之间的通信。信号和槽机制是Qt的核心特性,也是Qt与其他框架最大的不同之处。Qt的元对象系统是信号和槽实现的基础。在GUI编程中,当更改一个小部件时,通常希望另一个小部件得到通知。希望任何类型的对象之间都能够相互通信。例如,如果用户单击关闭按钮,可能希望调用窗口的Close()函数。其他软件工具包或框架可能使用回调机制实现这种通信机制...
一、导读 在使用Qt开发界面的时候,大小限定是常使用的操作。在界面元素的鼻祖QWidget中提供了一系列的方法,用于设定指定元素的大小或者最小/最大的大小: //设置最大高度void setMaximumHeight(int maxh) //设置最大大小void setMaximumSize(const QSize &) //设置最大大小(包含最大宽度、最大高度) void setMaximumSize(int maxw, int maxh) //设置最大宽度 void setMaximumWidth(int maxw) //设置最小高度 void setMinimumHeight(int minh) //设置最小大小 void set...
一、导读 哇,一个软件界面的颜值是引人注目的焦点,这些“超凡脱俗”的东西是开发人员的杰作吗?说是但也不是,首先软件界面会由专业的人员迸发灵感的去设计和美化,接着才是开发人员的场地,如果没有美化的步骤,放几个按钮和文本就搞定啦,这也太...。对于Qt来说,所有的可视小部件的基类都是QWidget:如何为一个界面加入设计好的背景图则是界面美化的核心操作之一,实现的方法有多种,本文将总结几种常使用的方法。对于如何“挖框贴图”则需要根据具体的界面内容来定,没有统一的方法了。二、方法实现 (2-1)使用paintEvent()实现paintEvent()...
一、导读 Qt是一个跨平台的软件开发工具,可以使用C++、Python、Qml语言开发项目。在实际项目开发过程中,其提供了一个界面描述文件(xxx.ui)用于描述界面中有哪些元素,我们也可以使用对应的设计工具Qt Designer手动进行界面设计和布局。本文基于Qt Designer,描述其提供的原生界面元素,除此之外,还描述如何使用自定义控件扩展Qt Designer。二、Qt Designer中提供的原生界面元素 使用Qt Designer在.ui文件中进行界面设计和布局时需要知道其包含哪些界面元素,如下图所示:一般情况下,使用上图所示的界面元素就能完成软件界面的设计了。三、Qt D...
一、导读 当使用QtCreator的『新工程创建向导』创建好一个最基本的项目工程后,我们则需要往项目工程中添加新的文件用于描述项目。一般情况下,在项目设计阶段,则会规划出具体的描述文件有哪些,名称如何命名,项目源码的目录结构如何划分等。如果想要为已有的工程添加新的文件,则需要使用QtCreator提供的『新文件创建向导』:本文主要描述新文件创建向导中各个选项的用途,基于QtCreator版本:8.0.1新文件创建向导就是将文件添加到已有的Qt项目工程中,且会在文件中生成最基本的代码。二、盘一盘文件模板 (3-1)添加C/C++文件如果想要为已有工程...
一、导读 在linux设备驱动模型中,总线是一个抽象的概念,是一类特殊的设备。在设备模型的实现中,内核规定了系统中的每个设备都需要连接到一个总线上,这个总线可以是一个内部的Bus、虚拟的Bus或者Platform 总线。在内核中通过struct but_type结构来描述总线,定义在include/linux/device.h中。本文首先描述与总线相关的数据结构,重点描述struct bus_type结构体内部各个元素的含义以及内部之间的联系。接着会描述linux设备驱动模型初始化过程中关于总线的初始化流程,这部分由buses_init()完成,最后会描述对总线的几个操作接口函数。本文所有源码...
导读 本文从软件角度分析linux内核USB子系统的热插拔过程,以实际分析思路和过程行文,基于linux内核版本:4.19.4,记录分析USB子系统时的所得。导读一、USB核心初始化二、USB设备的枚举过程(2-1)USB鼠标插入后日志分析(2-2)USB鼠标移除/拔下后日志分析三、 USB host控制器的初始化四、USB设备插入后的硬件过程五、USB设备插入后的软件过程一、USB核心初始化 如果linux内核开启了对USB的支持,在内核启动过程中,首先会对USB核心进行初始化,该过程则会打印出如下日志信息:(1)[ 0.476223] usbcore: registered new interface dri...
一、导读 在linux内核启动过程中,会向终端打印出很多的日志信息,从这些信息中可以得到许多内核的行为。如果在启动阶段出现了问题,那么很多的提示信息也会从终端打印出。这些信息的输出与具体模块功能的执行都归功于一个函数:do_initcalls,本文将主要分析这个函数的执行逻辑,且从这个函数延伸到linux各个子系统初始化背后的机制。本文所有源码分析基于linux内核版本:4.1.15二、do_initcalls do_initcalls由do_basic_setup()调用:do_basic_setup()由kernel_init()代表的内核init线程函数间接调用(在kernel_init_freeable()被调用)。在调用do...
一、导读 本文主要描述linux的usb子系统,此子系统较为庞大,且usb本身也比较复杂,本文姑且跳过这些复杂的话题,首先对usb做一个简单描述,接着会基于linux从硬件和软件视角描述usb结构和框图。(1-1)USB简介USB( Universal Serial Bus)是通用串行总线,用于计算机与外部设备的连接和通信。现如今USB接口可以说是随处可见,得到了大范围的应用。从USB发展史来看,出现了几个版本:USAB1.0、USB2.0、USB3.0、USB4.0USB1.0:USB 规范于 1995 年第一次发布,由 Intel、IBM、Microsoft 等公司组成的 USB-IF(USB Implement Forum)组织提出。USB-IF 与...
『为什么需要裁剪?』首先,裁剪并不一定是缩小内核镜像的大小,而是移植和适配。在整个技术栈中,移植和适配过程在不同阶段下,都会有很多人去做大量的工作。内核支持的特性很多,站在一个使用linux系统的项目角度,不一定全部需要这些特性和功能。这时候就需要将不需要的特性和功能剔除,随着这个过程的进行,内核的镜像会逐渐缩小。在实际裁剪过程中,可以按照如下思路进行:(1)第一步:使用make menuconfig编译构建出的linux图形化配置界面配置参数。(2)第二步:从源码构建目录正向分析linux内核行为。(3)第三步:从输出日志反推linux内核...
导读 嵌入式系统中,设备时间是一个重要的参数。一般情况下,为了让设备在断电情况下,系统能正常走时,会采用外部RTC芯片为系统提供断电后的系统走时。在linux内核中,内核对RTC的支持分成了两层:(1)与硬件无关的顶层字符驱动程序:用于实现内核的RTC相关的API。(2)与硬件相关的底层驱动程序:用于和底层总线进行通信。RTC API保证了用户空间的程序(工具)独立于底层平台和特定的RTC芯片,例如:hwclock则遵循这些API 接口对/dev/rtc进行操作。这些API也定义了sys(/sys/class/rtc)和proc(/proc/driver/rtc)文件系统中的属性。linux内核的...
一、导读 使用嵌入式linux作为设备的操作系统,当设备上电启动后,希望显示开机logo。一般会经历以下几个阶段:(1)运行芯片内部引导程序。(2)运行引导加载程序(u-boot较为常用)。(3)运行linux内核。(4)运行用户根文件系统,在这个阶段,就会根据项目特征运行具体的程序或者服务,最后则会进入一个人机交互软件终端。本文以u-boot作为引导加载程序,在运行时候,可以设置u-boot的启动logo,本文主要描述这个话题。二、获取u-boot源码 u-boot是一款在嵌入式领域常使用的引导加载程序。一般情况下,我们不会使用u-boot官方维护的源码,而是使...
一、导读 本文描述buildroot中支持的三种系统初始化方式以及buildroot在实际构建过程中是如何工作的。二、系统初始化的三种方式 我们已经知道,在linux内核启动后期会尝试加载用户空间的init程序,init程序是由内核启动的第一个用户空间程序(PID为1),该程序负责启动用户空间的服务和程序(例如:Web服务、图形应用程序、其他网络服务等)。在使用buildroot构建linux根文件系统时,其支持三种不同类型的初始化系统,可以在“System configuration”选项下的“Init system”选择项中进行选择:(1)第一种是“BusyBox”BusyBox 实现了基本的 init ...
在Linux系统中,/dev目录中包含了特殊的文件(即设备文件),正是由于这些设备文件的存在,才允许用户空间的应用程序访问由Linux内核管理的硬件设备。如果没有这些设备文件,即使Linux内核正确识别了硬件设备,用户空间的应用程序也无法使用它们。所以,位于/dev目录下的设备文件是用户空间程序与硬件设备进行交流的中间媒介。buildroot对/dev的四种处理方式 在buildroot中,提供了四种方式来处理/dev目录,他们位于System configuration选项下的/dev management选项中:(1)第一种方式是Static using device table这是 Linux处理设备文件的传统方...
本文描述buildroot的详细使用步骤,以恩智浦imx6ull处理器为运行平台。效果先上:一、获取buildroot 从https://buildroot.org/链接中下载buildroot:这里小生选择buildroot-2022.02.6.tar.xz版本:在Ubuntu20.04下解压缩软件包后,其目录结构大致如下所示:还是习惯性的剖析一下其目录中的内容:顶层目录下放置了一些都很常见的文件,还是一样的,makefile最重要,Config.in文件是一个makefile文件的配置输入,该文件由makefile读取解析,README文件中描述了buildroot的使用方法:(1)在arch目录下,以arch.xx的命名方式编写了针对特定架构的配置选...
导读 命令是linux操作系统独特的艺术,虽然Windows操作系统也有命令,但相比之下,linux的命令更加强大且具有魅力。大多数桌面和嵌入式linux发行版都包含了很多功能完备的命令行工具,然而busybox短小精悍,可以替代这些工具,在资源有限的嵌入式linux系统中更具有优势。busybox的使用 站在使用的角度,busybox的使用非常简单,如果配置和编译过linux内核,将会发现使用思路是一样的:(1)获取busybox源码。(2)在终端执行一个配置工具(可以使用make menuconfig编译出宿主机上的配置图形界面进行配置),如下图:在工具中可以指定交叉编译器路径...
linux内核启动过程的后期,在kernel_init()函数代表的init线程中,会尝试执行用户空间的init进程:从上述代码可见,会尝试执行/sbin/、/etc、/bin三个目录中的init。从《》一文可以知道,在busybox编译构建完成并安装后,会生成对应的目录(注:/etc目录不存在)。在/sbin目录中,则会存在一个init链接:查看其属性,其本质则是链接到了../bin/busybox:综上所述,证明linux内核启动后期,运行的第一个用户空间程序是init,在busybox源码中,init程序则由位于/init目录中的init.c编译构建而成,程序入口是:init_main(),小生在该函数中添加一行标识...
在嵌入式linux开发过程中,一般是在虚拟机中安装Linux发行版操作系统,然后在系统平台上进行开发。这时候会遇到虚拟机和目标硬件平台之间的网络环境搭建的诸多问题。很多时候,由于种种原因,笔记本电脑和目标板卡之间无法通过路由器连接,本文描述一种网络环境搭建方法:能保证虚拟机中的Linux系统和物理机都能上外网,也能通过TFTP和NFS来进行开发调试。环境如下:(1)笔记本电脑(Windows系统)通过连接WiFi访问外网。(2)笔记本电脑通过网口连接目标硬件板卡。(3)虚拟软件为VMware Workstation。版本:16.0.0(4)Linux发行版系统为:Ubuntu...
最近有一个嵌入式Excel表格数据导出的需求:应用软件运行于嵌入式Linux平台上,在设备运行过程中,存储了许多数据,这些数据想以表格的形式导出。考虑到Windows平台的普遍性,需要将数据以excel表格形式导出,故选择了一个开源库:QtXlsxWriter,本文主要记录其编译构建过程。从下列地址https://github.com/dbzhang800/QtXlsxWriter获取安装包,将源码包解压缩,目录结构如下图所示:example目录下存放的是示例Demo。src目录下存放的是xlsx的源码。tests目录下存放的是测试工程。QtXlsxWriter可以通过QtCreator来编译构建,所以我们打开安装在linux...
什么是嵌入式系统?嵌入式系统是以应用为中心,以计算机技术为基础,能够根据用户需求(功能、可靠性、成本、体积、功耗、环境等)灵活裁剪软硬件模块的专用计算机系统。它们通常用于特定的任务,具有高度的集成性和优化,以满足特定的性能要求。嵌入式系统技术是一种集成了硬件和软件的计算系统,旨在为特定任务或应用提供高效、可靠的解决方案。它通常用于嵌入在其他设备或系统中,以完成特定的功能,如家电、汽车、医疗设备等。嵌入式系统技术的发展促进了物联网的兴起。什么是物联网?物联网(IoT)是一个由大量互联的设备组成的网络,这些设备...
推荐理由基于go语言的开源物联网网关框架,设计思想很不错,值的学习~官网及驱动下载http://www.opengw.cnhttp://www.opengw.cn/col.jsp?id=104可执行文件下载https://gitee.com/my_iot/goAdapter/releases视频教程https://www.bilibili.com/video/BV1wg41157m9?from=search&seid=7860625376747338929&spm_id_from=333.337.0.0背景框架设计软件主要分成3层:• 应用接口用于与上层应用系统进行通信,可以设置定时上报硬件设备数据到物联网平台,或者接收物联网平台下发命令,转发给硬件设备;采用Json等格式数据与上层应用系统通信,对接更简单;•...
cppzmq是一个基于ZeroMQ的开源C ++库,用于构建分布式和并发应用程序。它提供了与ZeroMQ消息队列进行通信的简单接口。本文将介绍cppzmq的基本概念、常用模式以及示例代码。基本概念1. ZeroMQ:ZeroMQ是一个轻量级的消息队列库,它允许应用程序通过不同的通信模式进行消息传递。它可以在不同的进程或计算机之间进行通信,支持多种编程语言。2. cppzmq:cppzmq是ZeroMQ的C ++绑定,它提供了简单且易于使用的接口,用于在C ++程序中与ZeroMQ进行通信。常用模式1. 请求-应答模式(REQ-REP):这是一种典型的客户端-服务器模式。客户端发送一个请求消息给...
这种菜单样式比较常用,实现的方法也有很多种,比如可以直接使用QTableWidget,也可以用QStackedWidget实现。这里我是用QToolButton和QWidget+QScrollArea实现的。这个可以在实例化时指定菜单按键数。效果展示实现代码菜单实现代码头文件#ifndef CBASECONFIG_H#define CBASECONFIG_H/************************************************************************ * 名称:上导航菜单栏界面 * 上边是导航按键,下面是对应的界面 * 作者:fens*************************************************************************/#include <QWidget>#...
本文原创公众号:不会笑青年,授权转载请联系微信(laughyouth369),授权后,请在原创发表48小时后转载。< END >作者:不会笑青年漫画师:柒玥写在最后欢迎大家添加波哥的微信(识别下方二维码),我会在朋友圈更新日常思考,分享一下创业感悟和经历,可以围观朋友圈,一般不闲聊。添加时备注消息“电子书”,还会送大家一份优质电子书资料!由于添加的好友较多,通过可能较慢,还望海涵!识别上方二维码联系我
Go语言作为一种高效的编程语言,常常用于服务器端和网络编程。在Go语言中,你可以使用gomail.v2包来发送邮件。gomail.v2是一个功能强大的邮件库,支持发送HTML邮件、附件等。本文将介绍如何使用Go语言的gomail.v2包来发送邮件。欢迎微信关注:fensnote安装gomail.v2包首先,你需要安装gomail.v2包。你可以使用以下命令来安装gomail.v2包:go get gopkg.in/gomail.v2导入gomail.v2包接下来,你需要导入gomail.v2包。你可以使用以下代码导入gomail.v2包:import gomail "gopkg.in/gomail.v2"配置邮件信息现在,你需要配置邮件信息。你可以使用以下...
简述Lua与LuaJit的主要区别在于LuaJIT是基于JIT(Just-In-Time)技术开发的,可以实现动态编译和执行代码,从而提高了程序的运行效率。而Lua是基于解释器技术开发的,不能像LuaJIT那样进行代码的即时编译和执行。因此,在运行速度方面,LuaJIT要比Lua快得多。此外,LuaJIT还支持更多的操作系统和处理器架构,具有更广泛的适用性。但是,由于它引入了JIT技术,其实现复杂度更高,而且在一些特殊情况下,可能会存在性能问题。这里选择LuaJit在嵌入式Linux系统使用,LuaJit交叉编译也比较简单,没有第三方库的依赖,直接交叉编译源码即可。LuaJit移植-...
在嵌入式Linux中,可以使用Lua语言来扩展C语言应用程序的功能。具体而言,Lua可以被嵌入到C语言应用程序中,以便通过Lua脚本文件调用C语言函数或库。下面是一些步骤:1. 在嵌入式Linux中安装Lua库可以使用apt-get、yum等命令从Linux软件库中安装Lua库,也可以从Lua官网下载源代码编译安装。嵌入式系统里可以下载lua的源码包进行交叉编译,然后把编译的库文件和可执行文件下载到系统里即可。1. 在C语言应用程序中嵌入Lua库C语言应用程序需要使用Lua库的API来加载和执行Lua脚本。可以使用以下代码:#include <lua.h>#include <lauxlib.h>#include...