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

在上一篇文章中,主要是从宏观上去探讨Qt中UI的实现方案;这一篇文章,将给出具体的代码。

实现结果:
这里写图片描述

一、实现思路

上一篇文章讲到,布局工作的特点为“区域划分”、“层层嵌套”,同时整个布局工作中,关键点也在于如何划分区域、如何找到层层嵌套的关系。
在这个例子中,我将划分和嵌套关系组织如下:
1.对于主窗口,被分为了三个部分:左侧category、中间goodsList、右侧Info;
2.对于左侧部分和中间部分,较为简单,直接将Label、TextBrowser等子控件添加入相应的布局管理器后,父控件将该布局管理器设置为其布局就可以实现;
3.对于右侧,从上到下又分为三个部分:label、button群、spinBox群。对于后两个部分,再次使用“控件将含有子控件的布局管理器设为其布局”的方式实现。

二、代码

1.goodsList.h

#ifndef GOODSLIST_H
#define GOODSLIST_H

#include <QMainWindow>
#include <QGroupBox>
#include <QScrollArea>
#include <QListWidget>
#include <QTextBrowser>
#include <QLabel>
#include <QPushButton>
#include <QSpinBox>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QWidget>

class goodsList : public QMainWindow
{
    Q_OBJECT

public:
    explicit goodsList(QWidget *parent = 0);
    ~goodsList();

private:
    void createCategory();  //左侧category的布局
    void createGoodsList(); //中间goodsList的布局
    void createInfo();  //右侧Info的布局
    void createWholeLayout(); //主窗口布局

    enum {NUMGOODS = 20,NUMBUTTONS = 4};

    QGroupBox *categoryGroupBox;
    QScrollArea *goodsListScrollArea;
    QGroupBox *infoGroupBox;

    QListWidget *categoryListWidget;
    QTextBrowser *goodsTextBrowser[NUMGOODS];
    QLabel *priceLabel;
    QPushButton *operationButton[NUMBUTTONS];
    QSpinBox *countSpinBox[NUMGOODS];
    QWidget *buttonsWidget;
    QWidget *countWidget;
};

#endif // GOODSLIST_H

2.goodsList.cpp文件

#include "goodslist.h"
#include "QString"

goodsList::goodsList(QWidget *parent) :
    QMainWindow(parent)
{
     createCategory();
     createGoodsList();
     createInfo();
     createWholeLayout();
}


void goodsList::createCategory()
{
    categoryListWidget = new QListWidget;
    categoryListWidget->addItem(tr("分类一"));
    categoryListWidget->addItem(tr("分类二"));
    categoryListWidget->addItem(tr("分类三"));


    QVBoxLayout *categoryLayout = new QVBoxLayout;
    categoryLayout->addWidget(categoryListWidget);

    categoryGroupBox = new QGroupBox(tr("Category"));  //不能直接向GroupBox里添加子控件,只能通过设置布局管理器来间接添加子控件
    categoryGroupBox->setLayout(categoryLayout);

}


void goodsList::createGoodsList()
{
    goodsListScrollArea = new QScrollArea();

    QGridLayout *goodsListLayout = new QGridLayout;
    for(int i = 0; i < NUMGOODS; i++)
    {
        goodsTextBrowser[i] = new QTextBrowser(); //怎么添加文字
        goodsListLayout->addWidget(goodsTextBrowser[i],i/3,i%3);   //addItem和 addWidget有什么区别
    }

    goodsListScrollArea->setLayout(goodsListLayout);

}

void goodsList::createInfo()
{
    priceLabel = new QLabel(tr("total price:"));

    //组装4个button
    buttonsWidget = new QWidget;
    QGridLayout *buttonsLayout = new QGridLayout;
    for(int i = 0; i < NUMBUTTONS; i++)
    {
        operationButton[i] = new QPushButton(tr("Button %1").arg(i + 1)); //get技能:.arg()的用法
        buttonsLayout->addWidget(operationButton[i]);
    }
    buttonsWidget->setLayout(buttonsLayout);

    //组装购买商品信息
    countWidget = new QWidget;
    QGridLayout *countLayout = new QGridLayout;
    for(int i = 0; i < 5; i++)
    {
        countSpinBox[i] = new QSpinBox;
        countLayout->addWidget(countSpinBox[i],i / 2,i%2);
    }
    countWidget->setLayout(countLayout);

    //Info部分的总布局
    QVBoxLayout *infoLayout = new QVBoxLayout;
    infoLayout->addWidget(priceLabel);
    infoLayout->addWidget(buttonsWidget);
    infoLayout->addWidget(countWidget);

    infoGroupBox = new QGroupBox(tr("Info"));
    infoGroupBox->setLayout(infoLayout);
}


//主窗口的布局
void goodsList::createWholeLayout()
{
    QHBoxLayout *wholeLayout = new QHBoxLayout;
    wholeLayout->addWidget(categoryGroupBox);
    wholeLayout->addWidget(goodsListScrollArea);
    wholeLayout->addWidget(infoGroupBox);

    //设置拉伸因子
    wholeLayout->setStretchFactor(categoryGroupBox,1);
    wholeLayout->setStretchFactor(goodsListScrollArea,3);
    wholeLayout->setStretchFactor(infoGroupBox,2);

    //这部分要有,否则主窗口不会有显示
    QWidget *widget = new QWidget(this) ;
    widget->setLayout(wholeLayout);
    this->setCentralWidget(widget);
    setWindowTitle(tr("收银点餐系统"));

}

goodsList::~goodsList()
{
}

三、注意点

1.主窗口布局时,需要设置setCentralWidget()
首先,不能直接在对主窗口设置layout,需要在主窗口里面添加一个“主”Widget,并setCentralWidget(); 然后,将所有的东西放在这一个Widget中。


    //这部分要有,否则主窗口不会有显示
    QWidget *widget = new QWidget(this) ;
    widget->setLayout(wholeLayout);
    this->setCentralWidget(widget);
    setWindowTitle(tr("收银点餐系统"));

参考资料:

Qt自带实例:Basic Layouts Example
Qt入门学习——Qt Creator 中 ui 文件和 Qt 代码关系:http://blog.youkuaiyun.com/tennysonsky/article/details/48030333
QT布局管理器(QVBoxLayout,QHBoxLayout)不同部分比例大小设置方法:
http://blog.youkuaiyun.com/qinpanke/article/details/50952621
主窗口setCentralWidget():
http://yebaoshan.blog.163.com/blog/static/20423116720126267524060/
在QMainWindow添加控件,无法显示问题 :
http://blog.chinaunix.net/uid-25147458-id-3325066.html
拓展(这部分实现并未用到的):
model/view、Delegate: http://bbs.qter.org/forum.php?mod=viewthread&tid=663

采用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内容
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值