Qt界面开发纪实:Qt5 VS2017配置 Qt多线程实时刷新界面(QT C++ MSVC MinGW )(1)

Qt界面开发纪实:Qt5 VS2017配置 Qt多线程实时刷新界面(QT C++ MSVC MinGW )(1)

上一篇博客 https://blog.csdn.net/TiffanyXYf/article/details/99685835 可以算是粗略地记录了一下开发过程中踩到的坑,但是终究不够详细,对于新手来说参考意义不大,故在此详细介绍在开发过程中走的每一步,方便自己回顾,也方便新手参考。

开发工具,开发语言以及其它条件

根据甲方爸爸的要求,我们需要设计一个能够被主界面调用的子界面。由于他们的主界面是Qt做的,要求我们的开发环境也需要是Qt的;开发语言为C++。整个界面需要完成的功能包括:1.使用工业相机采集图片;2.对采集到的图片进行处理;3.根据主控命令(也就是主界面)的指令返回图片处理的结果;4.需要能够实时刷新或者以0.2s每次刷新界面;5.需要支持调试,调试内容较多,这里不做过多讲述。
所以我们的界面开发需要具备的条件有三个:1.Qt;2.C++; 3.工业相机。

开发工具的配置

在接手这项工作之前,博主没有接触过Qt,也没有用过C++进行过界面开发的工作,加上对VS稍微有一点熟悉,就听从师姐的建议在VS上集成Qt的开发工具,而在VS上进行开发(VS2017)。但是VS有一点比较麻烦,就是选择的Qt编译器必须是MSVC的,而不支持MinGW。博主在这方面吃了亏。(具体情况和工业相机的SDK有关,详情也可以查看上一篇博客)。总之,使用工业相机的C语言接口可以在VS上开发Qt界面,头文件和源文件都可以在直接在Qt上使用MingW编译。
如何配置VS+Qt
首先在VS的拓展和更新处查找Qt:工具==》拓展和更新。直接搜索下载就可以,我这里是已经安装好了。下载完成后,VS的菜单栏会多处一个Qt的菜单。
在这里插入图片描述
在这里插入图片描述
上述工作进行的过程中,安装Qt。和安装一般的软件一样,只有一点需要注意,就是选择需要的编译器。我直接选了MSVC和MinGW,32位和64位共四种。安装即可。

Qt安装好之后,为VS的“Qt VS Tools”设置编译器:点击Qt VS Tools ==》 最下方Qt Options ==》选择你要使用的编译器(如图,点击Add后直接从你的Qt安装目录中选定,选到如图所示的目录即可,VS记得选择MSVC的编译器)选择完成后就可以可以使用了。
在这里插入图片描述
在这里插入图片描述

新建工程
新建Qt GUI Application即可。
在这里插入图片描述
这个过程中可能会出现的坑:Qt VS Tools这里只显示Qt version 3.几.几……,没有所谓的选择编译器版本这些选项这个时候需要更新VS。 划重点,这里需要更新VS

如何实时刷新界面

信号槽机制+多线程实现界面刷新
信号和槽函数
信号和槽函数是Qt具备特色的机制。Qt通过信号函数向系统中发出特定信号,如果该信号没有特定的槽,则不会触发任何系统操作;如果有相应的槽函数与之连接,该特定信号发出后,与之对应的槽函数就会被执行。Qt界面中几乎所有与界面的交互都可以使用信号与槽完成。
把信号与槽连接起来有两种方式:1.直接再Qt界面上编辑,2.在自己的代码中将其连接
这两种方式各自有自己的适用范围:一般情况属于同一个UI的操作,可以直接在Qt界面上进行编辑,方便快捷;而属于不同的UI的信号与槽就可能需要手动绑定了。
在UI界面上点击如下菜单,进入信号与槽的编辑界面,在这里可以随意对UI中的控件添加信号与槽

在这里插入图片描述

点击想要编辑的控件==》下拉鼠标就会出现信号与槽的编辑界面,左边是信号,右边是槽,直接配对即可。
在这里插入图片描述
而手动配对:定义信号函数+槽函数+配对
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述的信号与槽属于不同的类,所以编辑的时候无法直接在UI上直接指定绑定关系。通过QObject::connect()可实现绑定。
发信号的时候直接 emit +你想的发的信号函数就可以了。(比如 emit sing_video(img),其中img是一个QImage的类型的变量)

多线程在实时刷新界面发挥的作用?
界面的显示本身是一个事件循环,也就是维持界面本身占用了一个线程,而我们没有办法做别的事情。也就是说如果没有多线程的话,这个程序会等你把所有的别的代码执行完,再显示界面。我的界面刚开始就是这样,运行一次就只能显示一张图片。
多线程的作用就是将采集图像(+图像处理)与图像显示分离开来。显示界面与图片处理互不干扰,而界面更新则依靠信号与槽。 开辟新的线程采集图片,采集到图片就发出一个信号,这个信号作用于一个对应的槽函数,这个槽函数实现对界面的更改。

Qt中开辟多线程十分简易,只要继承Qt中的Qthread就可以实现一个多线程的类,如图:
在这里插入图片描述
你想在子线程中实现的操作可以直接重写 void run (),线程启动时就会执行run函数中的操作。

如何启动
在UI类中声明这个线程的对象,在UI类的构造函数中把该对应的信号与槽对应好,然后启动线程即可。一般子线程中会写一个while循环来实现这个线程一直执行,并且不停地发信号,退出时打破循环
在UI类中声明线程对象
UI类的构造函数中启动线程
结束线程的时候,注意指针操作:
在这里插入图片描述

交换相机

前提情况:四个线程并发运行,分别操作不同的相机(采集图像、图像处理,显示处理结果)。在这种情况下我们需要交换图像显示的顺序。由于每个线程对应的显示框是一定的,所以这里值需要交换相机就可以了。为了简单起见,相机交换时会调用

thread->quit();
thread->wait();

交换完毕再调用

thread->start();

从而将线程重新启动。
而启动的线程的个数是和相机个数一致,弃用的相机对应的线程也会重新启动,但是由于弃用相机的flag是无效,所以线程会直接退出。

下一篇会接着介绍:在这个界面开发中学会的操作与遇到的坑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章