#include "mainwindow.h" #include "ui_mainwindow.h" #include "quihelper.h" #include "appinit.h" #include "frmstatus.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); this->initForm(); this->initNav(); this->initTree(); this->initPlot(); this->loadPlot(); this->initTable(); this->initPanel(); QTimer::singleShot(10, this, SLOT(changeColor())); } MainWindow::~MainWindow() { delete ui; } void MainWindow::initForm() { ui->treeWidget->setMinimumWidth(150); ui->btnAdd->setFixedSize(100, 80); ui->widgetStatus->setFixedHeight(130); customPlot = new QCustomPlot; ui->layout->addWidget(customPlot); //设置最后的拉伸距离 QList sizes; sizes << AppConfig::TreePanelWidth << AppConfig::MainPanelWidth; ui->splitter->setSizes(sizes); connect(ui->splitter, SIGNAL(splitterMoved(int, int)), this, SLOT(splitterMoved(int, int))); sizes.clear(); sizes << AppConfig::OpenGLPanelWidth << AppConfig::DataPanelWidth; ui->splitterMain->setSizes(sizes); connect(ui->splitterMain, SIGNAL(splitterMoved(int, int)), this, SLOT(splitterMoved(int, int))); sizes.clear(); sizes << AppConfig::PlotPanelWidth << AppConfig::TablePanelWidth; ui->splitterData->setSizes(sizes); connect(ui->splitterData, SIGNAL(splitterMoved(int, int)), this, SLOT(splitterMoved(int, int))); //换肤菜单 QMenu *menuStyle = new QMenu("换肤(&C)"); QStringList styleNames, styleFiles; QUIStyle::getStyle(styleNames, styleFiles); //加入分组产生互斥效果 QActionGroup *actionGroup = new QActionGroup(this); for (int i = 0; i < styleNames.count(); i++) { QAction *action = menuStyle->addAction(styleNames.at(i), this, SLOT(changeStyle())); action->setCheckable(true); action->setData(styleFiles.at(i)); actionGroup->addAction(action); //默认样式 if (styleFiles.at(i) == AppConfig::StyleName) { action->setChecked(true); } } this->menuBar()->addMenu(menuStyle); //其他菜单自己加 } void MainWindow::initNav() { int height = 25; //可以自行设置标题文字,默认为空 ui->navTitleOpenGL->setText("3D展示区域"); ui->navTitleOpenGL->setTextCenter(true); ui->navTitleOpenGL->setFixedHeight(height); ui->navTitleOpenGL->setRightIcon5(0xf078); connect(ui->navTitleOpenGL, SIGNAL(mousePressed(int)), this, SLOT(mousePressed(int))); ui->navTitleData->setText("数据展示区域"); ui->navTitleData->setTextCenter(true); ui->navTitleData->setFixedHeight(height); ui->navTitleData->setRightIcon5(0xf077); connect(ui->navTitleData, SIGNAL(mousePressed(int)), this, SLOT(mousePressed(int))); ui->navTitleStatus->setText("状态展示区域"); ui->navTitleStatus->setTextCenter(true); ui->navTitleStatus->setFixedHeight(height); ui->navTitleStatus->setRightIcon5(0xf078); connect(ui->navTitleStatus, SIGNAL(mousePressed(int)), this, SLOT(mousePressed(int))); } void MainWindow::mousePressed(int) { NavTitle *navTitle = (NavTitle *)sender(); if (navTitle == ui->navTitleOpenGL) { if (ui->widgetOpenGL->isVisible()) { ui->widgetOpenGL->setVisible(false); ui->navTitleOpenGL->setRightIcon5(0xf077); } else { ui->widgetOpenGL->setVisible(true); ui->navTitleOpenGL->setRightIcon5(0xf078); } } else if (navTitle == ui->navTitleData) { if (ui->widgetOpenGL->isVisible()) { ui->widgetOpenGL->setVisible(false); ui->navTitleData->setRightIcon5(0xf078); ui->navTitleOpenGL->setRightIcon5(0xf077); } else { ui->widgetOpenGL->setVisible(true); ui->navTitleData->setRightIcon5(0xf077); ui->navTitleOpenGL->setRightIcon5(0xf078); } } else if (navTitle == ui->navTitleStatus) { if (ui->widgetStatus->isVisible()) { ui->widgetStatus->setVisible(false); ui->navTitleStatus->setRightIcon5(0xf077); } else { ui->widgetStatus->setVisible(true); ui->navTitleStatus->setRightIcon5(0xf078); } } } void MainWindow::initTree() { ui->treeWidget->clear(); ui->treeWidget->setAnimated(false); ui->treeWidget->setHeaderHidden(true); //ui->treeWidget->setIndentation(0); QStringList texts; texts << "A" << "B" << "C" << "D"; for (int i = 0; i < texts.count(); i++) { //添加父节点 QTreeWidgetItem *itemParent = new QTreeWidgetItem(ui->treeWidget); itemParent->setText(0, QString("测试%1").arg(texts.at(i))); //循环添加子节点 for (int j = 0; j < 5; j++) { QTreeWidgetItem *itemChild = new QTreeWidgetItem(itemParent); itemChild->setText(0, QString("策略%1").arg(j + 1)); QPixmap iconNormal = IconHelper::getPixmap(QUIConfig::TextColor, 0xf02c, 18, 20, 20); itemChild->setIcon(0, iconNormal); } } ui->treeWidget->expandAll(); } void MainWindow::initPlot() { QFont font; font.setPixelSize(QUIConfig::FontSize - 1); customPlot->legend->setFont(font); customPlot->xAxis->setLabelFont(font); customPlot->yAxis->setLabelFont(font); customPlot->xAxis->setTickLabelFont(font); customPlot->yAxis->setTickLabelFont(font); customPlot->xAxis->setRange(0, 8, Qt::AlignLeft); customPlot->yAxis->setRange(0, 1024); customPlot->yAxis->setLabel("心跳曲线数据"); customPlot->xAxis->setVisible(true); customPlot->setInteractions(QCP::iRangeDrag); //customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); //customPlot->setInteractions(QCP::iSelectOther); //添加一个画布 customPlot->addGraph(); //开启定时器模拟数据 QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(loadPlot())); timer->start(100); } void MainWindow::loadPlot() { if (customPlot->graphCount() > 0) { int size = 8; #ifdef qcustomplot_v1 customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime); customPlot->xAxis->setDateTimeFormat("HH:mm:ss"); double key = QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000.0; customPlot->graph(0)->addData(key, qSin(key) * 1000); customPlot->graph(0)->removeDataBefore(key - size); #else static QTime timeStart = QTime::currentTime(); double key = timeStart.msecsTo(QTime::currentTime()) / 1000.0; customPlot->graph(0)->addData(key, qSin(key) * 1000); #endif customPlot->xAxis->setRange(key, size, Qt::AlignRight); customPlot->graph(0)->rescaleValueAxis(); customPlot->replot(); } } void MainWindow::initTable() { //设置列数和列宽 ui->tableWidget->setColumnCount(4); ui->tableWidget->setColumnWidth(0, 40); ui->tableWidget->setColumnWidth(1, 75); ui->tableWidget->setColumnWidth(2, 75); ui->tableWidget->setColumnWidth(3, 130); ui->tableWidget->verticalHeader()->setDefaultSectionSize(25); QStringList headText; headText << "编号" << "名称" << "测试结果" << "测试时间"; ui->tableWidget->setHorizontalHeaderLabels(headText); ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //ui->tableWidget->setAlternatingRowColors(true); ui->tableWidget->verticalHeader()->setVisible(false); ui->tableWidget->horizontalHeader()->setStretchLastSection(true); int rowCount = 8; ui->tableWidget->setRowCount(rowCount); for (int i = 0; i < rowCount; i++) { ui->tableWidget->setRowHeight(i, 20); QTableWidgetItem *itemID = new QTableWidgetItem(QString::number(i + 1)); QTableWidgetItem *itemName = new QTableWidgetItem(QString("测试设备%1").arg(i + 1)); QTableWidgetItem *itemContent = new QTableWidgetItem("结果正常"); QTableWidgetItem *itemTime = new QTableWidgetItem(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss")); itemID->setTextAlignment(Qt::AlignCenter); itemName->setTextAlignment(Qt::AlignCenter); itemContent->setTextAlignment(Qt::AlignCenter); itemTime->setTextAlignment(Qt::AlignCenter); ui->tableWidget->setItem(i, 0, itemID); ui->tableWidget->setItem(i, 1, itemName); ui->tableWidget->setItem(i, 2, itemContent); ui->tableWidget->setItem(i, 3, itemTime); } } void MainWindow::initPanel() { qDeleteAll(widgets); widgets.clear(); for (int i = 0; i < 3; i++) { frmStatus *widget = new frmStatus; widget->setFixedSize(110, 105); widget->setPixmap(QPixmap(":/image/device.png")); widget->setName(QString("仪器设备%1").arg(i + 1)); widget->setStatus(i % 2 == 0 ? 0 : 1); widgets << widget; } ui->panelWidget->setSpace(5); ui->panelWidget->setMargin(9, 9, 9, 0); ui->panelWidget->setColumnCount(100); ui->panelWidget->setWidgets(widgets); } void MainWindow::changeColor() { int textWidth = 1; QColor textColor = QColor(QUIConfig::TextColor); QColor bgColor = QColor(QUIConfig::NormalColorStart); QPen pen; pen.setWidth(2); pen.setColor(QUIConfig::HighColor); customPlot->graph(0)->setPen(pen); customPlot->graph(0)->setAntialiasedFill(true); customPlot->xAxis->setLabelColor(textColor); customPlot->yAxis->setLabelColor(textColor); customPlot->xAxis->setTickLabelColor(textColor); customPlot->yAxis->setTickLabelColor(textColor); customPlot->xAxis->setBasePen(QPen(textColor, textWidth)); customPlot->yAxis->setBasePen(QPen(textColor, textWidth)); customPlot->xAxis->setTickPen(QPen(textColor, textWidth)); customPlot->yAxis->setTickPen(QPen(textColor, textWidth)); customPlot->xAxis->setSubTickPen(QPen(textColor, textWidth)); customPlot->yAxis->setSubTickPen(QPen(textColor, textWidth)); customPlot->xAxis->grid()->setPen(QPen(textColor, textWidth)); customPlot->yAxis->grid()->setPen(QPen(textColor, textWidth)); customPlot->xAxis->grid()->setZeroLinePen(QPen(textColor, textWidth)); customPlot->yAxis->grid()->setZeroLinePen(QPen(textColor, textWidth)); customPlot->setBackground(bgColor); customPlot->axisRect()->setBackground(bgColor); customPlot->replot(); IconHelper::setIcon(ui->btnAdd, 0xf067, 35); } void MainWindow::changeStyle() { QAction *action = (QAction *)sender(); QString qssFile = action->data().toString(); AppConfig::StyleName = qssFile; AppConfig::writeConfig(); AppInit::Instance()->initStyle(qssFile); this->initTree(); this->changeColor(); } void MainWindow::splitterMoved(int pos, int index) { QList sizes; QSplitter *splitter = (QSplitter *)sender(); if (splitter == ui->splitter) { sizes = ui->splitter->sizes(); AppConfig::TreePanelWidth = sizes.at(0); AppConfig::MainPanelWidth = sizes.at(1); } else if (splitter == ui->splitterMain) { sizes = ui->splitterMain->sizes(); AppConfig::OpenGLPanelWidth = sizes.at(0); AppConfig::DataPanelWidth = sizes.at(1); } else if (splitter == ui->splitterData) { sizes = ui->splitterData->sizes(); AppConfig::PlotPanelWidth = sizes.at(0); AppConfig::TablePanelWidth = sizes.at(1); } AppConfig::writeConfig(); } void MainWindow::on_btnAdd_clicked() { frmStatus *widget = new frmStatus; widget->setFixedSize(110, 105); widget->setPixmap(QPixmap(":/image/device.png")); widget->setName("临时设备"); widget->setStatus(1); widgets << widget; ui->panelWidget->setColumnCount(100); ui->panelWidget->setWidgets(widgets); }