基于Qt的收银点餐系统之UI的改进——QStackedLayout和QScrollArea的使用
2017-10-16 21:20
489 查看
待解决问题:
在收银点餐系统之UI的基本实现中,我们实现了本系统中最基本的UI。这一个UI是静态的,不能够动态添加按钮(关于如何添加见参考资料);也不能实现点击不同的分类,出现不同的界面等。前者的逻辑通过代码很好实现,故不赘述;后者则需要用到一个布局管理器——QStackedLayout。
本文将在UI基本实现的基础上,添加两个新的功能:
1.实现点击不同的分类标签,能够切换到不同的界面;
2.在中间的展示部分,添加滚动条。
2.goodsList.cpp
2.QScrollArea的使用
对于第二种方式可以用下图理解:
3.关于QStackedLayout和QStackedWidget(?)
在首次开发的时候,使用QStackedLayout,在点击非按钮之外的区域,会报错;使用QStackedWidget则不会。而运行上面贴出的代码(QStackedLayout),并没有出现这样的问题。待解决。
参考资料:
Qt之QStackedLayout:http://www.mamicode.com/info-detail-1373381.html
拓展用Qt Designer实现:
QStackedWidget界面的操作步骤:https://jingyan.baidu.com/article/ed15cb1b71c1051be369819b.html
浅谈控件提升之stacked Widget: http://blog.csdn.net/li235456789/article/details/50790042
Qt窗口控件的动态添加和删除:http://blog.csdn.net/u013399898/article/details/51811970
在收银点餐系统之UI的基本实现中,我们实现了本系统中最基本的UI。这一个UI是静态的,不能够动态添加按钮(关于如何添加见参考资料);也不能实现点击不同的分类,出现不同的界面等。前者的逻辑通过代码很好实现,故不赘述;后者则需要用到一个布局管理器——QStackedLayout。
本文将在UI基本实现的基础上,添加两个新的功能:
1.实现点击不同的分类标签,能够切换到不同的界面;
2.在中间的展示部分,添加滚动条。
一、实现后的UI展示
二、代码
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> #include <QStackedLayout> class goodsList : public QMainWindow { Q_OBJECT public: explicit goodsList(QWidget *parent = 0); ~goodsList(); private: void createCategoryAndGoodslist(); //左侧category的布局 void createInfo(); //右侧Info的布局 void createWholeLayout(); //主窗口布局 //在中间goodsList区域创建可滑动区域 QScrollArea* create_area(int); enum {NUMGOODS = 20,NUMBUTTONS = 4}; QGroupBox *categoryGroupBox; QGroupBox *infoGroupBox; QStackedLayout *goodsDisplayLayout; //存放三个QScrollArea,并实现与存放在categoryListWidget的分类标签关联 QListWidget *categoryListWidget; 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) { createCategoryAndGoodslist(); // createGoodsList(); createInfo(); createWholeLayout(); } void goodsList::createCategoryAndGoodslist() { //准备左侧category categoryListWidget = new QListWidget; catego bd37 ryListWidget->addItem(tr("分类一")); categoryListWidget->addItem(tr("分类二")); categoryListWidget->addItem(tr("分类三")); QVBoxLayout *categoryLayout = new QVBoxLayout; categoryLayout->addWidget(categoryListWidget); categoryGroupBox = new QGroupBox(tr("Category")); //不能直接向GroupBox里添加子控件,只能通过设置布局管理器来间接添加子控件 categoryGroupBox->setLayout(categoryLayout); //准备中间goodsList并把三个widget添加入stackedLayout中 goodsDisplayLayout = new QStackedLayout(); for(int i = 0; i < 3;i++){ QScrollArea *area = create_area(i); goodsDisplayLayout->addWidget(area); } //将category和goodsList关联起来 connect(categoryListWidget,SIGNAL(currentRowChanged(int)),goodsDisplayLayout,SLOT(setCurrentIndex(int))); categoryListWidget->setCurrentRow(0); } 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)); 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->addLayout(goodsDisplayLayout); wholeLayout->addWidget(infoGroupBox); //设置拉伸因子 wholeLayout->setStretchFactor(categoryGroupBox,1); wholeLayout->setStretchFactor(goodsDisplayLayout,3); wholeLayout->setStretchFactor(infoGroupBox,2); //这部分要有,否则主窗口不会有显示 QWidget *widget = new QWidget(this) ; widget->setLayout(wholeLayout); this->setCentralWidget(widget); setWindowTitle(tr("收银点餐系统")); } QScrollArea* goodsList::create_area(int index){ int NUM = 50; //布局管理器的准备:将button放入gridLayout中 QGridLayout *layout = new QGridLayout(); for(int i = 0; i < NUM; i++){ QPushButton *pb = new QPushButton(QString::number(index+1)); layout->addWidget(pb,i/4,i%4); } // //直接将layout放在scrollArea中——不会出现滚动条 // QScrollArea *area = new QScrollArea(); // area->setLayout(layout); //scrollArea里面放一个widget,将layout放在widget里面——出现滚动条 QWidget *wg = new QWidget(); wg->setLayout(layout); QScrollArea *area = new QScrollArea(); area->setWidget(wg); return area; } goodsList::~goodsList() { }
三、代码中的注意点
1.如何使分类标签与滚动面板一一对应起来?connect(categoryListWidget,SIGNAL(currentRowChanged(int)),goodsDisplayLayout,SLOT(setCurrentIndex(int)));
2.QScrollArea的使用
// //直接将layout放在scrollArea中——不会出现滚动条 // QScrollArea *area = new QScrollArea(); // area->setLayout(layout); //scrollArea里面放一个widget,将layout放在widget里面——出现滚动条 QWidget *wg = new QWidget(); wg->setLayout(layout); QScrollArea *area = new QScrollArea(); area->setWidget(wg);
对于第二种方式可以用下图理解:
3.关于QStackedLayout和QStackedWidget(?)
在首次开发的时候,使用QStackedLayout,在点击非按钮之外的区域,会报错;使用QStackedWidget则不会。而运行上面贴出的代码(QStackedLayout),并没有出现这样的问题。待解决。
参考资料:
Qt之QStackedLayout:http://www.mamicode.com/info-detail-1373381.html
拓展用Qt Designer实现:
QStackedWidget界面的操作步骤:https://jingyan.baidu.com/article/ed15cb1b71c1051be369819b.html
浅谈控件提升之stacked Widget: http://blog.csdn.net/li235456789/article/details/50790042
Qt窗口控件的动态添加和删除:http://blog.csdn.net/u013399898/article/details/51811970
相关文章推荐
- 基于Qt的收银点餐系统之UI的基本实现(二)
- Qt : QScrollArea的使用,解答为什么无法出现滚动条.
- Qt 设计师中使用QScrollArea控件
- 基于开源库tufao,一个C + +的异步 Web 框架,使用Qt的对象的通信系统(信号与槽)
- Qt QScrollArea and layout in code
- 改进WINCE6.0基于RAM and ROM文件系统的设备使用便利性
- 基于qt5.2的银行管理系统--之前版本的改进
- 基于Qt的收银点餐系统之小票打印(二)
- 改进WINCE6.0基于RAM and ROM文件系统的设备使用便利性
- 基于Qt的收银点餐系统之小票打印(一)
- 使用Eric开发基于Qt的Python程序
- linux 2.6.24.4及根文件系统在S3C2410上的移植(使用4.3.2编译器支持eabi)(基于GEC2410)
- 如何使用QScrollArea
- WinForm"tableLayoutPanel和flowLayoutPanel的使用(附源码示例)" 之配餐系统的开发
- 基于qt和mysql的学生注册系统(一)
- 基于qt和mysql的学生注册系统(二)
- 基于qt和mysql的学生注册系统(二)
- FCAD-EMS电磁仿真系统:基于QT与OpenGL平台的CAD技术在电磁仿真系统中的应用
- Qt4中ui文件的使用方法
- 基于Jrobin监控系统UI展现