qt客户端如何搭建(图形用户界面应用程序框架)
时间:2023-09-12 11:13:32 整理: • 2人看过
Qt是一个跨平台的C图形用户界面应用框架。早在1991年,奇趣科技公司的两位合伙人就着手开发这样一个平台。2008年,如日中天的诺基亚因为看好Qt在嵌入式领域的潜力,收购了Qt作为新一代智能手机操作系统的载体。但因为诺基亚在智能手机领域的失利,不得不放下Qt,最终Qt在2012年被最后一任东家Digia收购。经过几年的发展,Qt不仅拥有完整的C图形库,而且大大提高了Qt开发跨平台应用的能力。
Qt可以同时支持桌面应用开发、嵌入式开发和移动开发,甚至它还可以做移动开发,覆盖所有现有的主流平台。您只需要编写一次代码,并在发布到不同的平台之前重新编译它。
哪些产品都是用Qt开发的?Qt已经成为开发跨平台桌面应用的好选择,它拥有一套GUI库和丰富的API库,支持Windows、Mac和Linux等原生平台。与国内一些优秀的桌面软件选择自己开发多平台GUI库不同,国外很多优秀的桌面应用更倾向于开发跨平台GUI库。比如硅谷有知名的文档管理应用DropBox,微软自己的社交聊天工具Skype,很多大型游戏的GUI页面,甚至国内金山软件公司推出的办公软件WPS Office,当然还有我们的AlphaBox。
为什么AlphaBox选择Qt?因为Qt不仅可以高效的完成不同平台GUI内容的开发,还可以高效的完成系统层面的一些任务。这也是AlphaBox选择使用Qt开发的原因。
AlphaBox其实包含了两个主要的进程,一个是同步盘的引擎——C语言搭建的底层同步进程,我们称之为daemon;其余的图形页面和与操作系统交互的模块都是使用Qt开发的。Qt提供的丰富的跨平台GUI组件,可以保证不同操作系统中的AlphaBox美观,符合操作系统的风格。Qt自己制作的IDE-Qt Creator提供了一套非常好用的图形界面构建工具,即使是刚接触Qt的小白也能轻松绘制出想要的页面,完成核心页面逻辑。此外,得益于C的加持,Qt拥有非常健壮的与操作系统的通信机制。有了这个,AlphaBox就可以轻松监控操作系统中文件的变化,建立本地数据库写入数据。不仅如此,优秀的混合编程能力可以让Qt轻松与Objective-C、C#等语言混合,实现系统级扩展的调用,这就是我们在Finder和Windows Explorer中可以看到的相似之处。
Qt优势优良的跨平台特性Qt支持Windows、Linux/Unix、Mac OS X、Android、BlackBerry、QNX等平台,并为这些不同的平台提供了统一的开发环境。
点击接收→音视频开发基础知识及资料包。
面向对象C是完全面向对象的,类似于objective-C的开发,Qt是一种基于C的语言的扩展,众所周知,C具有快速、简单、面向对象等诸多优点,所以Qt自然继承了C的这些优点。
Qt良好的打包机制使得Qt非常模块化,可重用,非常方便用户开发进货。Qt提供了一种安全类型的信号/插槽,而不是回调,这使得组件之间的合作非常简单。
丰富的APIQt包括250多个C类,还提供基于模板的集合、序列化、文件、I/Odevice、目录管理和日期/时间类。甚至包括正则表达式的处理功能。支持2D/3D图形渲染和OpenGL。大量的开发文档。
XML支持WebKit引擎的集成可以实现本地界面和Web内容的无缝集成,但是KDE这款基于Qt的重量级软件,真正让Qt在自由软件界的众多Widgets中脱颖而出的(比如Lesstif、Gtk、EZWGL、Xforms、fltk等等)。
信号和槽机制Qt提供了一种信号和插槽机制来完成面对面操作的响应,这是一种完成任意两个Qt对象的通信机制。其中,信号在一定的情境或动作下会被触动,槽位就是相当于接收和处理信号的功能。
为什么不直接调用方法。中间用信号和槽机制不是没必要吗?
其实在我们的生活中也是如此。在老板层面很好说话,老板给助手分配任务也很容易。但是,后果可想而知。在以前的统治阶级,这是绝对不允许发生的。所以在层次化的思维中,我们调用的函数也是这样的。上层可以调用下层和同层的函数,下层函数不能调用上层函数,否则会打破程序的层次结构,导致结构复杂,维护管理困难。
那么如何才能向上管理呢?有任务分配给老板怎么办?
老板会建立一个组织,也就是一个函数,无限循环的查询助理的状态。如果助理真的有事,组织会拿消息给老板处理。但是,这种处理有些复杂。我们想要的是简单明了的方法。如果助手有事件,我们可以直接调用boss函数来处理。
说了这么多,其实我想说的是,信号和槽最大的好处是完善了程序分层的思想,可以在不改变程序层次的情况下,完成从下层到上层的调用。下级发出信号,上级想与之关联的槽函数就会响应。
现在信号和槽位的问题是:
发送信号的对象只负责发送,但它并不知道由谁来接收信号;接收对象中的槽本身只是一个普通的成员函数,它并不知道响应哪个信号;要解决以上问题,需要将相应的信号与插槽连接起来。当指定的信号发出后,插槽所在的对象就可以接收到该信号,从而调用相应的插槽函数来执行指定的处理。
信号与槽的连接方式1。一个信号可以与另一个信号连接。
现在信号和槽位的问题是:
发送信号的对象只负责发送,但它并不知道由谁来接收信号;接收对象中的槽本身只是一个普通的成员函数,它并不知道响应哪个信号;要解决以上问题,需要将相应的信号与插槽连接起来。当指定的信号发出后,插槽所在的对象就可以接收到该信号,从而调用相应的插槽函数来执行指定的处理。
信号与槽的连接方式1。一个信号可以与另一个信号连接。
connect (Object1,signal(信号1),Object2,SIGNAL(信号2));
对象1的信号1传输可以触发对象2的信号1传输。
2。同一信号可以连接到多个插槽:
connect(对象1,信号(信号2),对象2,信号(槽2));
connect(对象1,信号(信号2),对象3,信号(槽1));
3。同一个插槽可以响应多个信号:
connect(对象1,信号(信号2),对象2,信号(槽2));
connect(对象3,信号(信号2),对象2,信号(槽2));
4。可以移除连接:
这种情况很少使用,因为当一个对象被删除时,Qt会自动移除与这个对象相关的所有连接。
disconnect(发送方,信号(信号),接收方,插槽(槽));
但是,常见的连接方法有:
connect (Object1,signal(信号),Object2,SIGNAL(插槽));
其中signal是对象1的信号,slot是对象2的槽。
# # #提示:信号和槽机制与普通函数的调用相同。如果使用不当,还可能在程序执行时产生无限循环。所以在定义槽函数的时候,一定要注意避免间接形成死循环,也就是在槽内再次发送相同的接收信号。如果一个信号与多个时隙相关联,当该信号被发送时,与之相关联的时隙被激活的顺序将是随机的。宏定义不能用在信号和槽的参数中。信号和插槽的参数数量和类型必须一致。
信号和槽机制优点类型安全需要相关的信号和时隙的签名必须相同。也就是说,信号的参数类型和数量与接收信号的插槽的参数类型和数量相同。然而,一个时隙的参数数量可以少于信号的参数数量,但是丢失的参数必须是信号的最后一个或多个参数。如果信号与槽的签名不匹配,编译器将报告一个错误。
松散耦合信号和槽机制大大降低了Qt对象的耦合度。发送信号的Qt对象不需要知道哪个对象接收了它的信号。它需要做的只是在适当的时候发送一个信号,它不需要知道也不需要关心自己的信号是否被接收到,更不用说知道哪个对象的哪个槽接收到了信号。
同样的,Qt对象的槽位也不需要与自身连接了哪些信号相关。如果信号连接到插槽,Qt可以确保调用适当的插槽。即使相关联的对象在运行时被删除。应用程序不会崩溃。
信号和槽的效率信号和槽机制增强了对象间通信的灵活性,但是在增加灵活性的同时当然会有一些性能上的损失。和回调函数相比,信号和槽机制有点慢。通常,通过传递信号调用槽函数会比直接调用非虚函数慢10倍。
点击接收→音视频开发基础知识及资料包。
原因:
需要定位接收信号的对象。安全地遍历所有的关联。编组/解组传递的参数。多线程的时候。信号可能需要排队等待。但是,与创建堆对象的new操作和删除堆对象的delete操作相比,信号和槽的运行开销只是其中的一小部分。对于实时应用,由信号和时隙机制引起的这种性能损失可以忽略;与信号和插槽提供的灵活性和简单性相比,这种性能损失是值得的。
Qt 布局系统介绍布局系统作为一名iOS开发者,我见证了iOS布局系统的不断完善,从绝对布局、自动调整大小到自动布局,让开发者的工作效率越来越高,项目界面的可读性和可维护性也越来越强。现在IDE中的可视化界面工具非常强大,很多网友& # 34;笑话& # 34;IOS开发者是& # 34;UI dragger & # 34所以一个优秀的布局系统的使命就是让开发者花更少的时间完成一个更易维护的界面。
同样,在Qt中,系统为视图在窗口中的布局提供了强大的排版机制。经过对Qt布局的初步探索,我们不得不对Qt布局系统的简单、高效和强大的功能表示赞叹。
布局系统的功能在Qt中,布局系统可以完成
定位子控件得知窗体默认大小得知窗体最小大小窗体大小变化时进行布局排版内容改变(字体大小文本等, 隐藏或显示, 移除)时进行布局排版布局系统的结构Qt提供了QLayout类及其子类来布局界面。其结构如下:
QLayout是布局系统中的抽象基类,继承自QObject和QLayoutItem,它的四个子类分别是
QBoxLayout(箱式布局)QFormLayout(表单布局)QGridLayout(网格布局)QStackedLayout(栈布局)在真实的使用场景中,往往需要结合各种布局来完成界面设计。接下来分别介绍四中的布局。
QBoxLayout 箱式布局Box layout提供了两个子类分别处理水平(QHBoxLayout)和垂直(QVBoxLayout)排版,可以按行或列显示视图。简单地说,这意味着控件可以排成一行。比如我们的AlphaBox,最上面的头像、名字、刷新按钮排成一排,就是横排的盒子布局:
你以为我会讲这个东西是怎么实现的?不是,我只是想以垂直框布局为例,用一个最简单的例子来介绍框布局的使用。首先,基于QWidget创建一个接口,并添加我们需要使用的头文件:
# include & lt;QVBoxLayout & gt
# include & lt;QPushButton & gt
并在构造函数中添加以下代码。
//添加两个按钮
q push button * ok BTN = new q push button;
ok BTN-& gt;setText(tr(& # 34;我在上面,我是最棒的& # 34;));
q push button * cel BTN = new q push button;
cel BTN-& gt;setText(tr(& # 34;我下面,我不服& # 34;));
//创建一个垂直的框布局,并在其中抛出两个按钮。
QVBoxLayout * layout = new QVBoxLayout;
布局-& gt;add widget(ok BTN);
布局-& gt;add widget(celBtn);
//将界面布局设置为垂直框布局。
setLayout(布局);
运行一下,看看效果。什么?这能跑吗?坐标在哪里?尺寸呢?是的,没错...单击运行:
上下两个按钮都按过了,垂直方向都立起来了,好强大,好省心。
QFormLayout 表单布局功能强大的AlphaBox是外向的,你可以很容易地把你的信息分享给其他用户。当我们分享的时候,会出现这样一个界面:
【/h/】看到这个界面,你可能会聪明的说,这个很简单,几个横框布局就可以实现了。但是,更智能的Qt提供了一种更高效的方式来帮助你完成这样的接口,那就是QFormLayout。
在我学Qt的书里,我把QFormLayout翻译成了表单布局。个人觉得翻译成表单布局更合适,因为QFormLayout的强大之处在于它能以最快的速度完成一个用户输入的表单界面的构建。
所以,我们来揭开AlphaBox的神秘面纱,看看这样的接口是如何实现的。
首先,将一个表单布局拖放到小部件中。
双击向窗体添加一行。
我相信当你看到这张图的时候,你已经能明白表单布局是怎么用的了,提供标签作为用户输入内容的指南,提供字段类型作为用户输入的控件。作为一名iOS开发人员,您知道构建这样一个界面所需的复杂工作量。当我第一次打开这个界面时,我被它的创建方式震惊了。
点击接收→音视频开发基础知识及资料包。
按照图中, 创建表单的第一行, 共享给哪个用户的输入框, 可以为输入框填写占位文字.双击 Form Layout 创建字段类型为 QComboBox (多选框)的一行. 填写允许的权限内容.设置整个 Widget 布局为垂直箱式布局在 Form Layout 下拖拽过去一个 Horizontal Layout(水平箱式布局)在箱式布局中添加 Horizontal Spacer (水平占位) 后拖拽两个 Push Button 完成界面布局
你快吗?快一点!快一点!!!
同样,如果使用的是纯代码形式的布局,可以使用addRow()方法添加一行。
QGridLayout 网格布局
其实强大的AlphaBox就是这样,我们可以分享给多个用户,下面会有一个列表显示分享的用户和权限列表。这时候表单布局已经不能满足我们了,只好另寻爱将——QGridLayout——网格布局。
网格布局,顾名思义,可以把界面分成行和列进行布局管理,把控件放在每个单元格中。所以AlphaBox共享的界面是用两行三列的网格布局实现的。
当然,越复杂的界面,Qt布局的效率也是很高的。我做了一个外部链接分享的布局演示,可以从内部数据生成一个下载链接,分享给任何人。
在这个界面中,我使用了标签页内的网格布局,如下图所示:
从图中可以看出,网格布局就像操作Excel、布局单元格、合并单元格等一样简单。
在这个界面中,更灵活地使用了QLayout的属性来完成界面布局。
同样,在代码中,您可以使用下面的Api添加一个控件,该控件占据网格视图的几行和几列:
void addWidget(QWidget *,int row,int column,int rowSpan,int columnSpan)
QStackedLayout 栈布局【/h/】比如在AlphaBox中,我们可以通过云文件浏览器直接查看和操作云文件,加载过程中会有翻菊界面。
加载失败时的错误提示:
当加载成功时:
通常情况下,应用界面会根据不同的状态有不同的内容。这时可以使用QStackedLayout,它提供了页面的堆叠,每个页面都有完全独立的界面布局,可以清晰的管理不同状态下界面的布局。
在Qt的可视化布局工具中,界面的堆栈式布局是通过堆叠的Widget来完成的。
右键单击以插入、删除和排序页面。
,