嵌入式Linux Qt开发:2、Qt creator简单配置、Qt Designer使用以及信号槽机制使用
一、前言
Qt creator比较轻量,而且是Qt自带的IDE,基本可以开箱即用,个人使用起来感觉还是比较舒服的,并且其自带的FakeVim也可以做一些Vim的配置,其主界面可以简单配置显示很多的窗口,让开发更加顺畅。
Qt Designer在我第一次使用的时候就给我眼前一亮的感觉,虽然有的时候不够灵活,部分动态界面也无法实现,但是可以让大多数新手快速开发一个带界面的PC软件,因此我觉得这是一个对新手极度友好的工具,让新手一开始就去掌握和使用布局的一些抽象概念是比较难的,但Qt creator只需要拖好控件然后选择布局方式就自动完成了,相较于学习前端时候页面布局的一脸懵,UI设计师让我新手期做布局的时候用一次感叹一次。该工具也让开发效率得到了很大提升,这种方式也让界面开发和后台功能开发分的更清晰一些,一些后台网络、设备的交互接口和UI的展现样式完全可以分开去做,UI样式的调整和用户去对接调整,后台功能需求和设备以及云端对接调整,最后组合起来即可,这种模块化供应链组合的方式使得各个模块可以并行进行,从而提高产品开发效率。
信号槽机制我觉得让界面交互更加方便,开始的时候可能不太理解怎么用,但是用的多了之后就感觉真香,几乎是无处不在的,特别是异步操作也可以不用多线程方式而是一个信号槽就可以搞定。
二、Qt creator简单配置
新手期基本上安装好Qt就直接使用Qt creator了,没有做什么配置也用了很长时间,但在后面熟悉之后开始做了一些折腾。
1、FakeVim简单配置
- 目前我用的比较多的配置一个是FakeVim(个人在Linux下用的vim比较多),习惯了vim后很多IDE我都会去配置vim,当时发现Qt creator也支持vim还是不免激动一番的,并且支持设置Ctrl C等常用的Ctrl按键使用普通文本工具的而不使用vim的相关Ctrl按键,其它的一些宏操作还是用的vim的,搜索这些全局搜索也还是用的Qt creator的,这样不用记忆太多的vim命令,一些常用的普通编辑器的Ctrl命令也不需要改,使用起来顺畅很多(也可以使用自己的.vimrc,但是我个人嫌麻烦就没有改,感兴趣的可以自己试一下);
工具->选项->FakeVim->Use FakeVim;开启FakeVim使用。
注意:要选择Pass control keys,这样Ctrl相关的按键vim就不会用了,就可以正常使用Ctrl A,Ctrl C这些功能了
也可以快捷键切换开关FakeVim(这里也是一些快捷键,比如折叠、格式化、拷贝、剪切一行等):
2、Qt creator编辑页简单配置
- Qt creator界面布局可以在左右两侧的侧边栏展示项目、打开文件、大纲和类等内容,便于查看
三、Qt Designer使用
Qt Designer也叫UI设计师,我们比较常用的就是根据UI的设计图来搭出各个界面,修改各个界面的分辨率大小,放置设计的一些控件,控件的布局组合,控件的简单样式修改(包括字体大小颜色、背景颜色等的调整),简单的控件点击页面跳转等,可以将设计师的设计效果做基础的展示。
1、总体介绍
如下图,比较直观的可以看出来,在左侧可以根据你的需要将相关控件拖动到中间的界面,拖完控件后还可以进行简单的纵向、横向、网格、区域布局,控件和界面的对象属性都可以在右下角进行设置,一般是设置便于区分的控件名称,大小,使能等,界面下方的信号槽编辑和action编辑可以编辑信号槽和标题栏的按钮动作,但一般我会直接选择右键控件来生成信号槽,然后在cpp代码中写对应的槽函数,还有一种更清晰的方式则是直接在cpp代码的初始化中写connect将控价的信号槽关联起来,这样我们删除时也清晰一些。
2、布局简单介绍
布局也可以右键界面或者选中几个控件进行布局:
然后布局就完成了,非常简单,这是布局后的结果:
3、调整界面大小及界面布局
我们选中界面,然后调整界面的大小为200*200,然后再对界面做一个格姗布局:
之后编译一下看看显示效果:
基本上UI设计师的使用就这点,多个界面的话就创建多个,然后利用控件的信号槽将界面关联起来就可以了,如果你的界面没有根据网络数据动态生成及变化的话那么UI设计师完全满足你的设计需求,简单的复杂的界面都可以这样去做,一些自定义的控件也可以添加进来(或者通过cpp代码写出来控件后提升基础控件)。
四、信号槽机制简介及使用
Qt 的信号槽机制是其核心特性之一,用于实现对象之间的通信。它允许对象在某些事件发生时发送信号,而其他对象可以连接到这些信号以接收通知(通过槽)。
1、信号和槽的定义
- 信号:当对象的状态发生变化时发出的通知。信号不需要实现,只需在类中声明。
- 槽:响应信号的函数。槽可以是普通成员函数,也可以是静态函数。
2、信号和槽的语法
信号和槽的定义通常在类的头文件中:
class MyClass : public QObject {Q_OBJECT // 需要在使用信号和槽的类中添加此宏public:MyClass();signals: // 信号部分void mySignal(int value);public slots: // 槽部分void mySlot(int value);
};
3、连接信号和槽
使用 QObject::connect
函数将信号连接到槽:
MyClass *obj = new MyClass();
connect(obj, &MyClass::mySignal, obj, &MyClass::mySlot);
4、发出信号
可以在类的成员函数中发出信号:
void MyClass::someFunction() {emit mySignal(1); // 发出信号
}
5、信号和槽的工作机制
- 当发出信号时,所有连接到该信号的槽会被调用。
- 可以连接多个槽到同一个信号,所有槽会按照连接顺序被调用。
6、连接类型
QObject::connect
可以使用不同的连接类型:
Qt::DirectConnection
:在同一线程中直接调用槽。Qt::QueuedConnection
:在不同线程中将槽调用放入事件队列。Qt::AutoConnection
(默认):根据信号和槽所在的线程自动选择连接类型。
7、使用 Lambda 表达式
Qt 5 及以上版本支持使用 lambda 表达式作为槽:
connect(obj, &MyClass::mySignal, [=](int value) {// 处理信号
});
这种方式就不需要再单独创建一个槽函数去关联了,适合槽函数处理一些简单的功能,功能较复杂时这样可读性就比较差了,有的编译器可能会报错,需要改成这种形式:
connect(obj, &MyClass::mySignal, this, [=](int value) {// 处理信号
});
8、注意事项
- 记得在类中包含
Q_OBJECT
宏。 - 使用
emit
关键字发出信号,虽然不是必需的,但可以增加代码的可读性。
信号槽机制使得 Qt 应用程序的设计变得灵活和模块化,可以方便地处理事件和响应。
9、关联使用信号槽的三种方式
这里其实方法比较多,这里我知道的有三种:
9.1、设计师界面上直接添加信号槽
直接在设计师界面上添加信号槽并选择控件和信号槽,这种用的比较少,功能或者界面比较简单的时候可以这么做。
像这里我对两个按钮的clicked信号关联到Widget界面的close和setFocus槽函数。
这种要么选择控件已经有的的槽函数,要么需要先实现自定义的槽函数,然后再在这里做关联。
9.2、设计师界面上选择控件转到槽
一种直接在控件上右键转到槽选择信号并生成槽函数,然后直接实现槽函数的逻辑。
这种就是先在界面上选好了信号和控件,然后再转到槽函数来实现槽函数,比较好理解,但是不需要关联信号槽,后续要删除对应的信号槽关联不好找。
9.3、代码中自己创建槽函数并关联信号
还有一种就是像上面那样connect函数直接连接信号槽,槽函数名称和连接都在代码中自己写,但是也更方便后期维护,有哪些信号槽关联在cpp代码中都可以看到,像上面两种方式要删除一些信号槽关联会麻烦一些。
五、最后
接下来我们对各个控件的使用做一下总结,针对其常见的样式设置、信号、槽函数都大体了解一下,后续界面和功能设计出来后就可以知道使用哪些控件来做了,功能好不好实现,界面设计已有控件能否达到效果就心中有数了。