C++之 Qt 实现图形界面 的 菜单切换以及代码封装

前言

Qt 使用 Qt Creator 编译器自带的 UI 图形界面设计,做一个简单的图形界面应用,速度快到起飞,功能比 JavaSwing 还强大多了,代码也是十分简洁的。

随着图形界面内容的丰富,功能的增加,把所有的代码都放在一组 .h+.cpp+.ui,会让后期维护变得困难了,我们需要做的,就是每一个页面,就一组 .h+.cpp+.ui,具体实现,看代码

代码结构

这里写图片描述

ui 设计

1、主界面

ui 编辑器内容

这里写图片描述

效果图

这里写图片描述

2、子菜单-工厂

ui 编辑器内容

这里写图片描述

效果图
这里写图片描述

3、子菜单-品牌

ui 设计

这里写图片描述

效果图

这里写图片描述

配置

这里写图片描述

#-------------------------------------------------
#
# Project created by QtCreator 2017-10-06T09:20:33
#
#-------------------------------------------------

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = carmanager
TEMPLATE = app


SOURCES += main.cpp\
widget.cpp \
factory.cpp \
brand.cpp

HEADERS += widget.h \
factory.h \
brand.h

FORMS += widget.ui \
factory.ui \
brand.ui

main.cpp

这里写图片描述

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();

return a.exec();
}

主界面

这里写图片描述

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<brand.h>
#include<factory.h>
namespace Ui {
       class Widget;
}

class Widget : public QWidget
{
       Q_OBJECT

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

       private slots:
       void on_buttonFactory_clicked();

       void on_buttonBrand_clicked();

       //处理来自Brand类的信号
       void hideBrand();

       //处理来自Factory类的信号
       void hideFactory();

private:
       Ui::Widget *ui;

       Brand brand;
       Factory factory;
};

#endif // WIDGET_H

这里写图片描述

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
       QWidget(parent),
       ui(new Ui::Widget)
{
       ui->setupUi(this);

       connect(&brand, &Brand::returnMain, this, &Widget::hideBrand);

       connect(&factory, &Factory::returnMain, this, &Widget::hideFactory);
}

Widget::~Widget()
{
       delete ui;
}

void Widget::on_buttonFactory_clicked()
{
       this->hide();
       factory.show();
}

void Widget::on_buttonBrand_clicked()
{
       this->hide();
       brand.show();
}

//定义处理来自Band的信号
void Widget::hideBrand()
{
       this->show();
       brand.hide();
}
//定义处理来自Factory的信号
void Widget::hideFactory()
{
       this->show();
       factory.hide();
}

工厂子界面

这里写图片描述

#ifndef FACTORY_H
#define FACTORY_H

#include <QDockWidget>

namespace Ui {
       class Factory;
}

class Factory : public QDockWidget
{
       Q_OBJECT

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

       private slots:
       void on_buttonReturn_clicked();

       //添加信号列表和信号
signals:
       void returnMain();

private:
       Ui::Factory *ui;
};

#endif // FACTORY_H

这里写图片描述

#include "factory.h"
#include "ui_factory.h"

Factory::Factory(QWidget *parent) :
       QDockWidget(parent),
       ui(new Ui::Factory)
{
       ui->setupUi(this);
}

Factory::~Factory()
{
       delete ui;
}

void Factory::on_buttonReturn_clicked()
{
       //发送给主界面信号
       emit returnMain();
}

品牌子界面

这里写图片描述

#ifndef BRAND_H
#define BRAND_H

#include <QDockWidget>

namespace Ui {
       class Brand;
}

class Brand : public QDockWidget
{
       Q_OBJECT

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

       private slots:
       void on_buttonReturn_clicked();

       //添加信号列表和信号
signals:
       void returnMain();

private:
       Ui::Brand *ui;
};

#endif // BRAND_H

这里写图片描述

#include "brand.h"
#include "ui_brand.h"

Brand::Brand(QWidget *parent) :
       QDockWidget(parent),
       ui(new Ui::Brand)
{
       ui->setupUi(this);
}

Brand::~Brand()
{
       delete ui;
}

void Brand::on_buttonReturn_clicked()
{
       //发送给主界面信号
       emit returnMain();
}

思考:

①子界面:有了 ui 的“转到槽”,则省略了槽的设计,直接在 .h 里面声明信号就可以了,接着在“转到槽”里面添加信号就完毕

②主界面:依旧在构造函数里边使用connect,依旧声明处理信号的槽函数,依旧定义处理信号的槽函数

③绝对优势:不用进行提升控件~!

其他

这里的 类似 on_buttonReturn_clicked() 函数、匹配的.xml,都是自动生成的,在 ui 编辑里边右击组件添加槽函数就会自动生成。

只是内容是自己添加的,这就是 Qt 的强大之处

猜你喜欢

转载自blog.csdn.net/larger5/article/details/79941031
今日推荐