基于Qt的收银点餐系统之UI的基本实现(一)

待解决问题:将拿到的设计图用Qt实现,完成系统的UI制作
即:
图一 设计图

                                   图一 设计图


图二 UI

                                 图二 UI

一、开发历程

可以说是从零开始,因为之前有关Qt的记忆已经消失得差不多了。
拿到设计图的时候,很迷,不知道如何在Qt中实现这样的布局,要实现“布局”这个工作逻辑是怎样的,会牵扯到哪些东西,要怎么用这些东西。
印象里面是可以用Qt Designer制作UI的,但已经忘了Qt Designer设计背后的逻辑关系,就没往这方面想。
后来,找到了Qt内置的一个demo,知道了牵扯到哪些东西(如layout,各种widgets等)以及怎么用的大方向,于是仿着那个demo,在网上学习控件细节,将界面完全用代码实现了出来。
由于缺少开发经验,没有合理的设计类,导致用于实现UI界面的代码和其他代码混在了一个类里面(非常糟糕的设计)。于是就在想有没有办法可以实现布局代码和逻辑代码的分离,这就又回到了Qt Designer。

二、Qt中制作UI的两种方式

这整个系统的开发中,我一共接触到了两种方式来制作UI:

  • 完全用代码手工实现UI
  • 使用Qt Designer实现UI

两者各有优缺点,有所联系,相互辅助。
1.完全用代码手工实现UI
优点:
1)能够对布局的机理有更深刻的理解;
2)较为灵活,如当一个功能需要根据某些不确定信息动态地添加按钮时,可用代码实现。

缺点:
1) 开发效率低;
2)设计出来的类规范程度低:相较于能够将布局里面的各要素组织得井井有条的Qt Designer,手动写的可能就注意不到那么多细节;
3)设计出来的类不合理:正如前面所说,实现布局的代码和逻辑代码混在了一起,同时给开发造成了一定的难度(e.g:变量太多,找不到)

2.使用Qt Designer实现UI
优点:
1)简单方便,可视化
2)开发效率较高
3)由于可以自动生成ui_xxx.h文件,不用自己关注布局代码和逻辑代码的分离
缺点:
不够灵活,不能满足存在动态需求的情况

3.两者的关系
1)在某些情况下,两种方法是平行的,即无论单独使用其中哪一个,均可以达到目的:
自己手动写的那个布局类,实际上与Qt Designer生成的、对开发者不可见的ui_xxx.cpp具有一样的功能。在使用上,手动写的布局类和其他类一样使用,即使用include引入头文件; 后者,除了头文件之外,还需要引入命名空间UI。
2)在某些情况下,两者相互配合:
即前文提到的,当需要实现“动态”任务时,可以先用Qt Designer设计出框架,然后用代码实现动态任务。

详细介绍见:http://blog.csdn.net/tennysonsky/article/details/48030333

三、“布局”中涉及的基本元素

要完成布局这个工作,我们需要首先了解些什么呢?
当我们新建Qt设计师类的时候,Qt给我们提供了三种类型的模板:

  • Dialog(对话框)
  • Main Window(主窗口)
  • Widget(控件)

第一个多用于交互,后两个在布局中会用到。而如何将控件合理地布局在窗口中,就需要Layout(布局管理器)的帮忙了。
1.窗口
在本篇文章使用到的例子中,窗口就是指图二所展示的那个整体,包括窗口名(“收银点餐系统”)、窗口自带按钮(_口X)等。
2.控件
比如说标签(QLabel)、行编辑器(QTextEdit)、按钮(QPushButton)、列表框(QListWidget)等;
3.布局管理器
Qt中提供很多布局管理器,包括QHBoxLayout, QVBoxLayout, QGridLayout, QStackedLayout等。在目标区域应用这些布局管理器,便可以将目标区域布局成相应的样子。目标区域,可以是主窗口,可以是控件,也可以是布局。示意图如下:
这里写图片描述
可以看出,布局管理器里边可以有布局管理器,控件里面也可以有布局管理器,在某种意义上,布局管理器就是一种控件。
到这里,我们可以把整个布局工作理解成为:用控件和布局管理器将这个大区域划分成若干个小区域,对小区域里用控件和布局管理器做同样的划分,直到布局完成。
其特点为:区域划分,层层嵌套
在下一篇文章中,将用代码展示这两个特点。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
采用C/S模式,完成一前台(服务器)对多客服端通讯,用Mysql数据库保存信息; 主要技术: 1.采用TCP/IP协议,容器完成服务端与多客户端的链接 服务端: server=new QTcpServer(this);建立端口 server->listen(QHostAddress::Any,PORT);监听端口 connect(server,SIGNAL(newConnection()),this,SLOT(accpetConnection()));等待用户链接 QTcpSocket* temp = server->nextPendingConnection();建立链接 client.push_back(temp);用户压栈 connect(temp,SIGNAL(readyRead()),this,SLOT(readData()));当端口有数据就读 读数据时先用迭代器遍历容器找到发送信息的客户端,再解析数据并响应 客户端: client=new QTcpSocket(this);建立端口 client->connectToHost(IP,PORT);链接主机 connect(client,SIGNAL(readyRead()),this,SLOT(readData()));端口有数据就读 2.界面布局 服务器 a.主菜单,预订,开台,换台,电子账单功能项采用QToolButton文字置于图片下面,水平布局 b.当前餐台信息与总餐台状态信息用QLabel垂直布局放于主窗体左侧 c.餐台信息采用QGraphicsView+QGraphicsScene+QGraphicsItem布局,view与item需要重写自己的类,Item包括图片与文本信息;将Item放入墙纸scene中,墙纸scene贴到墙view上完成显示。 客户端 a.选择桌号与人数用QLabel,对应的下拉选项用QComboBox,确认,呼叫与结账功能用QToolButton,这些控件水平布局放置于窗体最上方 b.左侧用QTabWidget其中加入特价菜单与我的菜单两个子窗体 c.中间为QGraphicsView+QGraphicsScene+QGraphicsItem布局布局菜单图片与价格名称,菜单信息服务器发送至客户端与客户端的图片匹配起来。 d.右侧为菜单类型分类按键,采用垂直布局 3.信号与槽机制的运用 a.预订,开台,换台功能的实现:点击对应的按钮触发clicked()信号,与之对应的槽函数中QToolButton *btn = (QToolButton *)sender();区分信号源,弹出对应的子窗体让用户输入相应信息,按确定按钮修改SQL对应Table内容然后发送输入信息信号,主窗体接受到信号调用槽函数(相应窗体成员调用其布局函数重布局)重新布局整个界面(餐台信息与左侧总餐台状态同时更新) b.鼠标悬浮于餐台信息Item时图片放大:改写了QGraphicsSceneMouseEvent事件实现 c.主菜单与电子账单的显示采用QSqlTableModel+QTableView加载整个SQL中相应的Table显示Table内容

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值