赞
踩
布局方案在整个数据可视化大屏界面电子看板系统中,是除了基础功能以外的核心功能之一,只有具备了布局方案这个功能,才能让用户随意调整自己想要的布局,保存成自定义名称的布局配置文件,这样就大大增加了灵活性,可以更好的适应各种分辨率,毕竟客户的电脑运行环境各种各样的都有,模块数量众多,有些不想展示,有些需要特别放大展示,有些需要偶尔全屏展示等,这些布局用户都可以自己定义好保存配置方案,存储到指定的目录下,下次启动会自动生成对应的布局菜单文件让用户自行选择切换。
公众号:Qt实战,各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发。
公众号:Qt入门和进阶,专门介绍Qt/C++相关知识点学习,帮助Qt开发者更好的深入学习Qt。多位Qt元婴期大神,一步步带你从入门到进阶,走上财务自由之路。
官方店:https://shop114595942.taobao.com/
电子看板是目视化管理的一种表现形式,即对数据的状况一目了然地表现,主要是对于管理项目,它通过利用形象直观而又色彩适宜的各种视觉感知信息来组织现场生产活动,目视管理依据人类的生理特征,在生产现场充分利用信号灯、标识牌、符号颜色等方式来发出视觉信号,鲜明准确地刺激人的神经末梢,快速地传递信息,形象直观地将潜在的问题和浪费现象都显现出来。以便任何人都可以及时掌握管理现状和必要的情报,从而能够快速制定并实施应对措施。因此,管理看板是发现问题、解决问题的非常有效且直观的手段,是优秀的现场管理必不可少的工具之一。
字段 | 描述 | 默认值 |
---|---|---|
WorkMode | 工作模式 timer-模拟数据 db-数据库采集 tcp-网络采集 http-post请求 | timer |
Title | 软件标题,显示在软件中间顶部 | 数字化工厂信息中心 |
Ratio | 分辨率,目前无意义 | 4096*216 |
Layout | 布局方案,每次切换布局方案以后都会保存 | 完整布局 |
Theme | 配色方案,每次切换配色方案以后都会保存 | 紫色风格 |
VideoAddr | 视频流地址,视频模块播放的视频地址 | 凤凰卫视 |
AutoRun | 是否开机启动 | false |
MoveEnable | 模块是否可以拖动,启用以后模块可以任意拖动 | true |
CutLeftBottom | 底部布局左侧是否切掉 | true |
CutRightBottom | 底部布局右侧是否切掉 | true |
StaticLine | 是否绘制静态定位线,为假则绘制游标十字线 | true |
字段 | 描述 | 默认值 |
---|---|---|
ColorMainBg | 主背景颜色 | QColor(4, 7, 38) |
ColorPanelBg | 面板背景颜色 | QColor(26, 29, 60) |
ColorLine | 十字线定位线颜色 | QColor(255, 0, 0) |
ColorLine1 | 线条1颜色 | QColor(0, 176, 180) |
ColorLine2 | 线条2颜色 | QColor(32, 159, 223) |
ColorLine3 | 线条3颜色 | QColor(255, 192, 0) |
ColorTitleBg | 标题栏背景颜色 | QColor(48, 48, 85) |
ColorTitleText | 标题栏文字颜色 | QColor(255, 255, 255) |
ColorChartBg | 曲线图表背景颜色 | QColor(38, 41, 74) |
ColorChartText | 曲线图表文字颜色 | QColor(250, 250, 250) |
ColorChartGrid | 曲线图表网格颜色 | QColor(180, 180, 180) |
ColorOk | 正常颜色 | QColor(0, 176, 180) |
ColorLow | 警戒颜色 | QColor(255, 192, 0) |
ColorAlarm | 报警颜色 | QColor(214, 77, 84) |
ColorDisable | 禁用背景颜色 | QColor(210, 210, 210) |
ColorPercent | 环形百分比背景颜色 | QColor(0, 254, 254) |
字段 | 描述 | 默认值 |
---|---|---|
MainFont | 全局字号 | 微软雅黑,12 |
NameFont | 软件名称字号 | 19 |
LabFont | 加粗标签字号 | 12 |
DeviceFont | 设备面板字号 | 12 |
SubTitleFont | 模块子标题栏字号 | 13 |
TitleFont | 模块标题栏字号 | 15 |
TitleHeight | 模块标题栏高度 | 23 |
HeadHeight | 表格表头高度 | 28 |
RowHeight | 表格行高度 | 25 |
字段 | 描述 | 默认值 |
---|---|---|
IntervalModule1 | 模块1采集间隔 | 5000 |
IntervalModule2 | 模块2采集间隔 | 5000 |
IntervalModule3 | 模块3采集间隔 | 5000 |
IntervalModule4 | 模块4采集间隔 | 5000 |
IntervalModule5 | 模块5采集间隔 | 5000 |
IntervalModule6 | 模块6采集间隔 | 5000 |
IntervalModule7 | 模块7采集间隔 | 5000 |
IntervalModule8 | 模块8采集间隔 | 5000 |
字段 | 描述 | 默认值 |
---|---|---|
LocalDBType | 本地数据库类型,Sqlite、Mysql等 | Mysql |
LocalDBIP | 本地数据库主机地址 | 127.0.0.1 |
LocalDBPort | 本地数据库端口 | 3306 |
LocalDBName | 本地数据库名称 | bigscreen |
LocalUserName | 本地数据库用户名 | root |
LocalUserPwd | 本地数据库密码,以密文存储 | root |
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "quiwidget.h"
#include "appinit.h"
#include "customtitlebar.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->initForm();
this->changeLayout(App::Layout, true);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::closeEvent(QCloseEvent *)
{
closeAll();
}
void MainWindow::initForm()
{
this->setWindowTitle(App::Title);
//this->setProperty("canMove", true);
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
//自动根据分辨率找合适的默认的布局文件夹
layoutPath = QUIHelper::appPath() + "/layout";
if (QUIHelper::deskWidth() == 1440) {
QDir dir(QUIHelper::appPath() + "/layout_1440");
if (dir.exists()) {
layoutPath = QUIHelper::appPath() + "/layout_1440";
}
} else if (QUIHelper::deskWidth() == 1920) {
QDir dir(QUIHelper::appPath() + "/layout_1920");
if (dir.exists()) {
layoutPath = QUIHelper::appPath() + "/layout_1920";
}
}
module1 = new frmModule1;
module2 = new frmModule2;
module3 = new frmModule3;
module4 = new frmModule4;
module5 = new frmModule5;
module6 = new frmModule6;
module7 = new frmModule7;
module8 = new frmModule8;
moduleCenter = new frmModuleCenter;
moduleVideo = new frmModuleVideo;
//启动模拟数据或者数据采集
module1->start(App::IntervalModule1);
module2->start(App::IntervalModule2);
module3->start(App::IntervalModule3);
module4->start(App::IntervalModule4);
module5->start(App::IntervalModule5);
module6->start(App::IntervalModule6);
module7->start(App::IntervalModule7);
module8->start(App::IntervalModule8);
//实例化停靠窗体
newWidget(module1, "年度产量汇总");
newWidget(module2, "当月计划达成率");
newWidget(module3, "设备监控");
newWidget(module4, "模具进度");
newWidget(module5, "负荷分布");
newWidget(module6, "送检一次合格率");
newWidget(module7, "品质管理");
newWidget(module8, "物料管理");
newWidget(moduleVideo, "视频监控");
QList<QWidget *> widgets;
widgets << module1 << module2 << module3 << module4 << module5 << module6 << module7 << module8 << moduleCenter << moduleVideo;
connect(moduleCenter, SIGNAL(changeLayout(QString)), this, SLOT(changeLayout(QString)));
connect(moduleCenter, SIGNAL(saveLayout(QString, int)), this, SLOT(saveLayout(QString, int)));
connect(moduleCenter, SIGNAL(changeTheme(QString)), this, SLOT(changeTheme(QString)));
connect(moduleCenter, SIGNAL(closeAll()), this, SLOT(closeAll()));
//设置拉伸策略
for (int i = 0; i < widgets.count(); i++) {
widgets.at(i)->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
}
//设置中心窗体
this->setCentralWidget(moduleCenter);
//设置停靠参数,不允许重叠,只允许拖动
this->setDockOptions(QMainWindow::AnimatedDocks);
//将底部左侧作为左侧区域,底部右侧作为右侧区域,否则底部区域会填充拉伸
if (App::CutLeftBottom) {
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
}
if (App::CutRightBottom) {
setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
}
}
void MainWindow::clearWidget()
{
for (int i = 0; i < widgets.count(); i++) {
this->removeDockWidget(widgets.at(i));
}
}
void MainWindow::initWidget()
{
//添加左侧窗体
addWidget(widgets.at(0), 0);
addWidget(widgets.at(7), 0);
addWidget(widgets.at(3), 0);
//添加右侧窗体
addWidget(widgets.at(6), 1);
addWidget(widgets.at(4), 1);
addWidget(widgets.at(5), 1);
//添加底部窗体
addWidget(widgets.at(2), 3);
addWidget(widgets.at(1), 3);
addWidget(widgets.at(8), 3);
}
void MainWindow::newWidget(QWidget *widget, const QString &title)
{
//自定义停靠窗体标题栏
QString objName = widget->objectName();
CustomTitleBar *titleBar = new CustomTitleBar;
titleBar->setObjectName("titleBar_" + objName);
titleBar->setTitle(title);
//实例化停靠窗体
QDockWidget *dockWidget = new QDockWidget;
dockWidget->setObjectName("dockWidget_" + objName);
dockWidget->setWindowTitle(title);
dockWidget->setTitleBarWidget(titleBar);
dockWidget->setWidget(widget);
//如果设置了不可移动则只允许关闭
if (!App::MoveEnable) {
dockWidget->setFeatures(QDockWidget::DockWidgetClosable);
}
//设置顶部不可停靠
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea | Qt::BottomDockWidgetArea);
widgets << dockWidget;
}
void MainWindow::addWidget(QDockWidget *widget, int position)
{
//设置停靠位置
Qt::DockWidgetArea area;
if (position == 0) {
area = Qt::LeftDockWidgetArea;
} else if (position == 1) {
area = Qt::RightDockWidgetArea;
} else if (position == 2) {
area = Qt::TopDockWidgetArea;
} else if (position == 3) {
area = Qt::BottomDockWidgetArea;
}
this->addDockWidget(area, widget);
//如果是首次生成布局则需要全部可见
QString file = QString("%1/%2.ini").arg(layoutPath).arg(App::Layout);
if (!QFile(file).exists()) {
widget->setVisible(true);
}
}
void MainWindow::changeLayout(const QString &layout, bool init)
{
//首次加载不需要比较是否和配置文件一样
bool needLoad = init;
if (!init && App::Layout != layout) {
needLoad = true;
//先保存原有布局
saveLayout(App::Layout, 2);
}
if (needLoad) {
App::Layout = layout;
App::writeConfig();
this->clearWidget();
this->initWidget();
this->initLayout(App::Layout);
//全屏+QWebEngineView控件一起会产生右键菜单无法弹出的BUG,需要上移一个像素
QRect rect = qApp->desktop()->screenGeometry();
#if 1
rect.setY(-1);
rect.setHeight(rect.height());
#else
rect.setX(30);
rect.setY(40);
rect.setWidth(1370);
rect.setHeight(795);
#endif
this->setGeometry(rect);
}
}
void MainWindow::initLayout(const QString &layout)
{
QString file = QString("%1/%2.ini").arg(layoutPath).arg(layout);
QSettings set(file, QSettings::IniFormat);
set.beginGroup("MainWindow");
restoreState(set.value("State").toByteArray());
set.endGroup();
}
//type: 0-新建布局 1-恢复布局 2-保存布局 3-布局另存
void MainWindow::saveLayout(const QString &layout, int type)
{
//如果为空则表示是恢复布局
if (type == 0) {
App::Layout = layout;
this->changeLayout(App::Layout, true);
return;
} else if (type == 1) {
this->changeLayout(App::Layout, true);
return;
}
QString file = QString("%1/%2.ini").arg(layoutPath).arg(layout);
QSettings set(file, QSettings::IniFormat);
set.beginGroup("MainWindow");
set.setValue("State", saveState());
set.endGroup();
App::Layout = layout;
App::writeConfig();
}
void MainWindow::changeTheme(const QString &theme)
{
//必须是风格改变了才需要重新应用
if (App::Theme != theme) {
App::Theme = theme;
App::writeConfig();
AppInit::Instance()->initTheme();
AppInit::Instance()->initStyle();
}
}
void MainWindow::closeAll()
{
saveLayout(App::Layout, 2);
QUIHelper::sleep(100);
exit(0);
}
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。