logplus/logPlus/mainwindownew.cpp

1047 lines
37 KiB
C++
Raw Normal View History

2025-10-29 17:23:30 +08:00
#include "mainwindownew.h"
#include "ui_mainwindownew.h"
#include <QVBoxLayout>
#include <QScrollArea>
#include <QRandomGenerator>
//
#include "formhead.h"
#include "formtitle.h"
#include "formdraw.h"
#include "formline.h"
#include "mycustomplot.h"
#include "CallManage.h"
#include "qtcenterwidgets.h"
#include "qtcommonclass.h"
//以下参数从配置文件读取
extern int g_iIndex;
extern int g_iNum;
extern int g_iOneWidth; //道宽
extern int g_iHeadHigh; //道头高度
extern int g_iTitleHigh; //道对象高度
extern int g_iCurveHigh;//曲线高度
extern int g_iMove; //道头偏移
extern int g_iPointNum; // number of points in graph
extern int g_iLineNum; // number of Line
extern int g_iWidth; //道宽
//
extern int g_iX1;
extern int g_iX2;
extern int g_iY1;
extern int g_iY2;
extern int g_iCanZoom ;
MainWindowNew::MainWindowNew(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindowNew)
{
ui->setupUi(this);
// 设置工具栏的位置,此处设置为在左侧
addToolBar(Qt::LeftToolBarArea, ui->toolBar);
//初始化工具栏
initMainToolBar();
initToolBar();
//参数从配置文件读取
ReadConfig();
//加载样式
//loadStyle(":/qrc/qss/lightblue.css");
//loadStyle(":/qrc/qss/blacksoft.css");
loadStyle(":/qrc/qss/flatgray.css");
//setWindowState(Qt::WindowMaximized);//最大化
//停靠
dockLayout();
//QWidget *centralWidget = ui->centralWidget;
centralWidget = ui->centralWidget;
//----------------------
graphicsView = new QGraphicsView(this);
scene = new QGraphicsScene(this);
graphicsView->setScene(scene);
//
auto *layout = new QVBoxLayout(centralWidget);
layout->setContentsMargins(0,0,0,0);
layout->addWidget(graphicsView);
//----------------------
// 添加多个按钮或其他小部件来模拟内容过多的情况
QString strName = "";
for (int i = 0; i < g_iIndex; ++i) {
//道头
strName = "" + QString::number(i+1);
FormHead *formHead = new FormHead(graphicsView, i+1);
formHead->Init();
formHead->Add(strName, QColor(Qt::white));
formHead->setGeometry(g_iMove+g_iOneWidth*i, 0, g_iOneWidth, g_iHeadHigh); // 设置标签的位置和大小
//对象
FormTitle *formTitle = new FormTitle(graphicsView, i+1);
formTitle->setGeometry(g_iMove+g_iOneWidth*i, g_iHeadHigh, g_iOneWidth, g_iTitleHigh); // 设置标签的位置和大小
//
MyCustomPlot *curv = new MyCustomPlot(graphicsView, i+1);
//背景设置成透明色
curv->setBackground(Qt::transparent);
curv->setStyleSheet("background: transparent;");
curv->setGeometry(0.5+g_iOneWidth*i, g_iHeadHigh+g_iTitleHigh-15, g_iOneWidth+29, g_iCurveHigh); // 设置标签的位置和大小
initForm(curv, "", g_iLineNum, formTitle);
//
scene->addWidget(formHead);
scene->addWidget(formTitle);
scene->addWidget(curv);
// 连接信号和槽
connect(formTitle, &FormTitle::sig_LineClicked, curv, &MyCustomPlot::s_LineClicked);
connect(formTitle, &FormTitle::removeSelectedGraphByTitle, curv, &MyCustomPlot::removeSelectedGraphByTitle);
}
if(g_iMove+g_iOneWidth*g_iNum < g_iWidth)
{
centralWidget->setGeometry(0, 0, g_iWidth, g_iHeadHigh+g_iTitleHigh+g_iCurveHigh); // 设置标签的位置和大小
}
else {
centralWidget->setGeometry(0, 0, g_iMove+g_iOneWidth*g_iNum, g_iHeadHigh+g_iTitleHigh+g_iCurveHigh); // 设置标签的位置和大小
}
//滚动条
//QScrollArea *scrollArea = new QScrollArea();
scrollArea = new QScrollArea();
// widget是你想要放置内容的QWidget
scrollArea->setWidget(centralWidget);
// 设置滚动条一直显示
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
// 设置滚动区域为主窗口的中心部件
setCentralWidget(scrollArea);
//关联信号槽
connect(CallManage::getInstance(), SIGNAL(sig_Open()), this, SLOT(s_open()));
connect(CallManage::getInstance(), SIGNAL(sig_Risize()), this, SLOT(s_risize()));
connect(CallManage::getInstance(), SIGNAL(sig_AddOne()), this, SLOT(s_addOne()));
connect(CallManage::getInstance(), SIGNAL(sig_AddLine(int)), this, SLOT(s_addLine(int)));
connect(CallManage::getInstance(), SIGNAL(sig_DelOne(int)), this, SLOT(s_delOne(int)));
connect(CallManage::getInstance(), SIGNAL(sig_SaveImg()), this, SLOT(s_SaveImg()));
connect(CallManage::getInstance(), SIGNAL(sig_DrawImg()), this, SLOT(s_DrawImg()));
connect(CallManage::getInstance(), SIGNAL(sig_DrawLine()), this, SLOT(s_DrawLine()));
}
MainWindowNew::~MainWindowNew()
{
delete ui;
}
//初始化工具栏
void MainWindowNew::initMainToolBar()
{
QSize toolIconSize(18, 18);
ui->mainToolBar->setIconSize(toolIconSize); //设置工具栏图标大小
QIcon newFileIcon(":/image/new.png");
QIcon openFileIcon(":/image/open.png");
QIcon compileIcon(":/image/compile.png");
QIcon runIcon(":/image/capacity.png");
QIcon debugIcon(":/image/anaysis.png");
QIcon grepIcon(":/image/grab.png");
QIcon loadIcon(":/image/export.png");
m_newAc = new QAction(newFileIcon, "控制", this);
m_openAc = new QAction(openFileIcon, "竖绘", this);
m_grepAc = new QAction(grepIcon, "锁头", this);
m_compileAc = new QAction(compileIcon, "加载图文件", this);
m_runAc = new QAction(runIcon, "设置井", this);
m_debugAc = new QAction(debugIcon, "撤销", this);
m_loadAc = new QAction(loadIcon, "重做", this);
ui->mainToolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); //此种方式为文字显示在图标右侧
//add QAction to Widget.
ui->mainToolBar->addAction(m_newAc);
ui->mainToolBar->addAction(m_openAc);
ui->mainToolBar->addAction(m_grepAc);
ui->mainToolBar->addAction(m_compileAc);
ui->mainToolBar->addAction(m_runAc);
ui->mainToolBar->addAction(m_debugAc);
ui->mainToolBar->addAction(m_loadAc);
// connect(m_openAc, &QAction::triggered, this, &MainWindow::s_Open);
// connect(m_grepAc, &QAction::triggered, this, &MainWindow::s_Risize);
// connect(m_compileAc, &QAction::triggered, this, &MainWindow::s_AddOne);
// connect(m_runAc, &QAction::triggered, this, &MainWindow::s_SaveImage);
// connect(m_debugAc, &QAction::triggered, this, &MainWindow::s_DrawImg);
// connect(m_loadAc, &QAction::triggered, this, &MainWindow::s_DrawLine);
}
//初始化工具栏
void MainWindowNew::initToolBar()
{
QSize toolIconSize(18, 18);
ui->toolBar->setIconSize(toolIconSize); //设置工具栏图标大小
QIcon newFileIcon(":/image/new.png");
QIcon openFileIcon(":/image/open.png");
QIcon compileIcon(":/image/compile.png");
QIcon runIcon(":/image/capacity.png");
QIcon debugIcon(":/image/anaysis.png");
QIcon grepIcon(":/image/grab.png");
QIcon loadIcon(":/image/export.png");
m_newAc2 = new QAction(newFileIcon, "", this);
m_openAc2 = new QAction(openFileIcon, "", this);
m_grepAc2 = new QAction(grepIcon, "", this);
m_compileAc2 = new QAction(compileIcon, "", this);
m_runAc2 = new QAction(runIcon, "", this);
m_debugAc2 = new QAction(debugIcon, "", this);
m_loadAc2 = new QAction(loadIcon, "", this);
m_newAc2->setToolTip("");
m_openAc2->setToolTip("深度");
m_grepAc2->setToolTip("曲线");
m_compileAc2->setToolTip("波列");
m_runAc2->setToolTip("解释结论道");
m_debugAc2->setToolTip("固井结论道");
m_loadAc2->setToolTip("井壁取心");
ui->toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); //此种方式为文字显示在图标右侧
//add QAction to Widget.
ui->toolBar->addAction(m_newAc2);
ui->toolBar->addAction(m_openAc2);
ui->toolBar->addAction(m_grepAc2);
ui->toolBar->addAction(m_compileAc2);
ui->toolBar->addAction(m_runAc2);
ui->toolBar->addAction(m_debugAc2);
ui->toolBar->addAction(m_loadAc2);
// connect(m_openAc, &QAction::triggered, this, &MainWindow::s_Open);
// connect(m_grepAc, &QAction::triggered, this, &MainWindow::s_Risize);
// connect(m_compileAc, &QAction::triggered, this, &MainWindow::s_AddOne);
// connect(m_runAc, &QAction::triggered, this, &MainWindow::s_SaveImage);
// connect(m_debugAc, &QAction::triggered, this, &MainWindow::s_DrawImg);
// connect(m_loadAc, &QAction::triggered, this, &MainWindow::s_DrawLine);
}
void MainWindowNew::ReadConfig()
{
int iIndex;
int iNum;
int iOneWidth;
int iHeadHigh;
int iTitleHigh;
int iCurveHigh;
int iMove;
int iPointNum;
int iLineNum;
// 1.获取当前运行程序的目录路径
QString applicationDirPath = QCoreApplication::applicationDirPath();
QString configPath;
configPath = applicationDirPath + "/config/config.ini";
//从配置文件读取
QtCommonClass *qtCommon = new QtCommonClass(this);
qtCommon->readConfigSize(configPath, iIndex, iNum, iOneWidth, iHeadHigh, iTitleHigh, iCurveHigh, iMove, iPointNum, iLineNum);
g_iIndex = iIndex;
g_iNum = iNum;
g_iOneWidth = iOneWidth; //道宽
g_iHeadHigh = iHeadHigh; //道头高度
g_iTitleHigh = iTitleHigh; //道对象高度
g_iCurveHigh = iCurveHigh;//曲线高度
g_iMove = iMove; //道头偏移
g_iPointNum = iPointNum; // number of points in graph
g_iLineNum = iLineNum; // number of Line
//
qtCommon->readXyRange(configPath, g_iX1, g_iX2, g_iY1, g_iY2);
}
void MainWindowNew::loadStyle(const QString &qssFile)
{
//加载样式表
QString qss;
QFile file(qssFile);
if (file.open(QFile::ReadOnly)) {
//用QTextStream读取样式文件不用区分文件编码 带bom也行
QStringList list;
QTextStream in(&file);
//in.setCodec("utf-8");
while (!in.atEnd()) {
QString line;
in >> line;
list << line;
}
file.close();
qss = list.join("\n");
QString paletteColor = qss.mid(20, 7);
this->setPalette(QPalette(paletteColor));
//用时主要在下面这句
this->setStyleSheet(qss);
}
}
void MainWindowNew::addRandomGraph(MyCustomPlot *widget, QVector<double> x, QVector<double> y, FormTitle *formTitle, QString strLineName)
{
widget->addGraph();
if(strLineName=="")
{
strLineName = QString("曲线 %1").arg(widget->graphCount());
}
widget->graph()->setName(strLineName);
widget->graph()->setData(x, y);
widget->graph()->setLineStyle((QCPGraph::LineStyle)(1));//曲线
//widget->graph()->setLineStyle((QCPGraph::LineStyle)(std::rand()%5+1));
//widget->graph()->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsLine));//曲线
//widget->graph()->setLineStyle((QCPGraph::LineStyle)(QCPGraph::lsImpulse));//杆状
// if (std::rand()%100 > 50)
// widget->graph()->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(std::rand()%14+1)));
widget->graph()->setScatterStyle(QCPScatterStyle((QCPScatterStyle::ScatterShape)(1)));
//widget->graph()->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 5));
QPen graphPen;
QColor lineColor = QColor(std::rand()%245+10, std::rand()%245+10, std::rand()%245+10);
graphPen.setColor(lineColor);
//graphPen.setWidthF(std::rand()/(double)RAND_MAX*2+1);
graphPen.setWidthF(2);
widget->graph()->setPen(graphPen);
//widget->replot();
//道-对象
formTitle->Add(strLineName, lineColor);
}
void MainWindowNew::initForm(MyCustomPlot *widget, QString strName, int num, FormTitle *formTitle)
{
//道-对象清空
formTitle->Init();
//
//widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes |
// QCP::iSelectLegend | QCP::iSelectPlottables);
widget->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables);
//拖动区域放大‌(即通过鼠标左键拖动绘制矩形框选区域进行放大)/////////////////
if(g_iCanZoom==1)
{
widget->setInteraction(QCP::iRangeDrag, false); // 关闭拖动
widget->setSelectionRectMode(QCP::SelectionRectMode::srmZoom); // 启用框选放大
//
widget->selectionRect()->setPen(QPen(Qt::black, 1, Qt::DashLine)); // 虚线边框
widget->selectionRect()->setBrush(QBrush(QColor(0,0,100,50))); // 半透明蓝色填充
//
QCPSelectionRect *selectionRect = new QCPSelectionRect(widget);
connect(selectionRect, &QCPSelectionRect::accepted, [=]() {
// 当选择完成时,获取矩形范围并放大
QRectF rect = selectionRect->rect(); // 获取选择的矩形区域(像素坐标)
// 转换为坐标轴范围
double x1 = widget->xAxis->pixelToCoord(rect.left());
double x2 = widget->xAxis->pixelToCoord(rect.right());
double y1 = widget->yAxis->pixelToCoord(rect.top());
double y2 = widget->yAxis->pixelToCoord(rect.bottom());
// 设置新的坐标轴范围
widget->xAxis->setRange(x1, x2);
widget->yAxis->setRange(y1, y2);
widget->replot();
});
}
//拖动区域放大‌(即通过鼠标左键拖动绘制矩形框选区域进行放大)//////////////
widget->m_iX1 = g_iX1;
widget->m_iX2 = g_iX2;
widget->m_iY1 = g_iY1;
widget->m_iY2 = g_iY2;
//
widget->xAxis->setRange(g_iX1, g_iX2);
widget->yAxis->setRange(g_iY1, g_iY2);
widget->axisRect()->setupFullAxesBox();
widget->xAxis->ticker()->setTickCount(10);//x个主刻度
widget->yAxis->ticker()->setTickCount(60);//y个主刻度
// 设置刻度密度
// QSharedPointer<QCPAxisTickerFixed>MyTicker(new QCPAxisTickerFixed);
// MyTicker->setTickStep(10);
// MyTicker->setTickCount(300);
// widget->xAxis->setTicker(MyTicker);
// widget->plotLayout()->insertRow(0);
// QCPTextElement *title = new QCPTextElement(widget, strName, QFont("sans", 17, QFont::Bold));
// widget->plotLayout()->addElement(0, 0, title);
// widget->xAxis->setLabel("x");
// widget->yAxis->setLabel("y");
//对调XY轴在最前面设置
QCPAxis *yAxis = widget->yAxis;
QCPAxis *xAxis = widget->xAxis;
widget->xAxis = yAxis;
widget->yAxis = xAxis;
// widget->legend->setVisible(true);
// QFont legendFont = font();
// legendFont.setPointSize(10);
// widget->legend->setFont(legendFont);
// widget->legend->setSelectedFont(legendFont);
// widget->legend->setSelectableParts(QCPLegend::spItems); // legend box shall not be selectable, only legend items
QVector<double> x(g_iPointNum), y(g_iPointNum);
for(int k=0; k<num; k++)
{
double xScale = (std::rand()/(double)RAND_MAX + 0.5)*2;
double yScale = (std::rand()/(double)RAND_MAX + 0.5)*2;
double xOffset = (std::rand()/(double)RAND_MAX - 0.5)*4;
double yOffset = (std::rand()/(double)RAND_MAX - 0.5)*10;
double r1 = (std::rand()/(double)RAND_MAX - 0.5)*2;
double r2 = (std::rand()/(double)RAND_MAX - 0.5)*2;
double r3 = (std::rand()/(double)RAND_MAX - 0.5)*2;
double r4 = (std::rand()/(double)RAND_MAX - 0.5)*2;
//
for (int i=0; i<g_iPointNum; i++)
{
x[i] = -i*0.1;//(i/(double)n-0.5)*10.0*xScale + xOffset;
//y[i] = ((std::rand()/(double)RAND_MAX)*30-g_iX2)*0.6;
int randomNumber = QRandomGenerator::global()->bounded(10);
y[i] = (qSin(x[i]*r1*5)*qSin(qCos(x[i]*r2)*r4*3)+r3*qCos(qSin(x[i])*r4*2))*yScale + yOffset + randomNumber*0.01;
}
addRandomGraph(widget, x, y, formTitle, "");
}
//widget->rescaleAxes();
widget->replot();
}
void MainWindowNew::s_open()
{
// 1.获取当前运行程序的目录路径
QString applicationDirPath = QCoreApplication::applicationDirPath();
QString fileNames;
fileNames = applicationDirPath + "/test.csv";
QList<QStringList> listDatas;
QFile file(fileNames);
if (!file.exists())
{
QMessageBox::information(nullptr, "提示", "test.csv文件不存在");
return;
}
//
if (file.open(QIODevice::ReadOnly))
{
int iIndex = 1;
bool isHeader = true;
while (!file.atEnd())//判断是否读到文件尾
{
QString strData = QString::fromLocal8Bit(file.readLine().replace("\r\n", "")); //按行读,追加
//string strData = file.readLine().data();//QString::fromLocal8Bit(file.readLine()); //按行读,追加
if (isHeader)
{
isHeader = false;
}
else
{
QString strNewData = "";
strNewData = strData; //按行读,追加
//QString strNewData = QString::fromStdString(strData);
QStringList array = strNewData.split(",");
if (array.size() == 0)
{
continue;
}
listDatas.append(array);
iIndex++;
}
}
file.close();
}
for(int iDataNum=0; iDataNum<4; iDataNum++)
{
if(g_iMove+g_iOneWidth*g_iNum < g_iWidth)
{
centralWidget->setGeometry(0, 0, g_iWidth, g_iHeadHigh+g_iTitleHigh+g_iCurveHigh); // 设置标签的位置和大小
}
else {
centralWidget->setGeometry(0, 0, g_iMove+g_iOneWidth*(g_iNum+1), g_iHeadHigh+g_iTitleHigh+g_iCurveHigh); // 设置标签的位置和大小
}
//道头
QString strName = "" + QString::number(g_iIndex+1);
FormHead *formHead = new FormHead(graphicsView, g_iIndex+1);
formHead->Init();
formHead->Add(strName, QColor(Qt::white));
formHead->setGeometry(g_iMove+g_iOneWidth*g_iNum, 0, g_iOneWidth, g_iHeadHigh); // 设置标签的位置和大小
formHead->setVisible(true);
//对象
FormTitle *formTitle = new FormTitle(graphicsView, g_iIndex+1);
formTitle->setGeometry(g_iMove+g_iOneWidth*g_iNum, g_iHeadHigh, g_iOneWidth, g_iTitleHigh); // 设置标签的位置和大小
formTitle->setVisible(true);
//
MyCustomPlot *curv = new MyCustomPlot(graphicsView, g_iIndex+1);
//背景设置成透明色
curv->setBackground(Qt::transparent);
curv->setStyleSheet("background: transparent;");
curv->setGeometry(0.5+g_iOneWidth*g_iNum, g_iHeadHigh+g_iTitleHigh-15, g_iOneWidth+29, g_iCurveHigh); // 设置标签的位置和大小
curv->setVisible(true);
//initForm(curv, "", 0, formTitle);
//-------------
scene->addWidget(formHead);
scene->addWidget(formTitle);
scene->addWidget(curv);
//道-对象清空
formTitle->Init();
//
//curv->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes |
// QCP::iSelectLegend | QCP::iSelectPlottables);
curv->setInteractions(QCP::iSelectLegend | QCP::iSelectPlottables);
//拖动区域放大‌(即通过鼠标左键拖动绘制矩形框选区域进行放大)/////////////////
if(g_iCanZoom==1)
{
curv->setInteraction(QCP::iRangeDrag, false); // 关闭拖动
curv->setSelectionRectMode(QCP::SelectionRectMode::srmZoom); // 启用框选放大
//
curv->selectionRect()->setPen(QPen(Qt::black, 1, Qt::DashLine)); // 虚线边框
curv->selectionRect()->setBrush(QBrush(QColor(0,0,100,50))); // 半透明蓝色填充
//
QCPSelectionRect *selectionRect = new QCPSelectionRect(curv);
connect(selectionRect, &QCPSelectionRect::accepted, [=]() {
// 当选择完成时,获取矩形范围并放大
QRectF rect = selectionRect->rect(); // 获取选择的矩形区域(像素坐标)
// 转换为坐标轴范围
double x1 = curv->xAxis->pixelToCoord(rect.left());
double x2 = curv->xAxis->pixelToCoord(rect.right());
double y1 = curv->yAxis->pixelToCoord(rect.top());
double y2 = curv->yAxis->pixelToCoord(rect.bottom());
// 设置新的坐标轴范围
curv->xAxis->setRange(x1, x2);
curv->yAxis->setRange(y1, y2);
curv->replot();
});
}
//拖动区域放大‌(即通过鼠标左键拖动绘制矩形框选区域进行放大)//////////////
if(iDataNum==0)
{
curv->m_iX1 = -5000;
curv->m_iX2 = 5000;
curv->m_iY1 = -500;
curv->m_iY2 = 0;
//
curv->xAxis->setRange(-5000, 5000);
curv->yAxis->setRange(-500, 0);
curv->axisRect()->setupFullAxesBox();
curv->xAxis->ticker()->setTickCount(10);//x个主刻度
curv->yAxis->ticker()->setTickCount(60);//y个主刻度
}
else if(iDataNum==1 || iDataNum==2)
{
curv->m_iX1 = 0;
curv->m_iX2 = 150;
curv->m_iY1 = -500;
curv->m_iY2 = 0;
//
curv->xAxis->setRange(0, 150);
curv->yAxis->setRange(-500, 0);
curv->axisRect()->setupFullAxesBox();
curv->xAxis->ticker()->setTickCount(10);//x个主刻度
curv->yAxis->ticker()->setTickCount(60);//y个主刻度
}
else if(iDataNum==3)
{
curv->m_iX1 = 10;
curv->m_iX2 = 20;
curv->m_iY1 = -500;
curv->m_iY2 = 0;
//
curv->xAxis->setRange(10, 20);
curv->yAxis->setRange(-500, 0);
curv->axisRect()->setupFullAxesBox();
curv->xAxis->ticker()->setTickCount(10);//x个主刻度
curv->yAxis->ticker()->setTickCount(60);//y个主刻度
}
//对调XY轴在最前面设置
QCPAxis *yAxis = curv->yAxis;
QCPAxis *xAxis = curv->xAxis;
curv->xAxis = yAxis;
curv->yAxis = xAxis;
//
// 连接信号和槽
connect(formTitle, &FormTitle::sig_LineClicked, curv, &MyCustomPlot::s_LineClicked);
connect(formTitle, &FormTitle::removeSelectedGraphByTitle, curv, &MyCustomPlot::removeSelectedGraphByTitle);
//
g_iIndex++;
g_iNum++;
//画线---------------
if(curv && formTitle)
{
int iSize = listDatas.size();
QVector<double> x(iSize), y(iSize);
for (int i=0; i<iSize; i++)
{
x[i] = 0 - listDatas[i][0].toDouble();
y[i] = listDatas[i][iDataNum+1].toDouble();
}
QString strLineName = QString("新增曲线 %1").arg(curv->m_indexLine+1);
curv->m_indexLine++;
addRandomGraph(curv, x, y, formTitle, strLineName);
//curv->rescaleAxes();
curv->replot();
}
}
}
void MainWindowNew::s_risize()
{
g_iCanZoom = 1;
}
void MainWindowNew::s_addOne()
{
// QMessageBox::StandardButton reply;
// reply = QMessageBox::question(this, "提示", "是否添加新道?",
// QMessageBox::Yes | QMessageBox::No);
// if (reply != QMessageBox::Yes) {
// return; // 取消
// }
//QWidget *centralWidget = ui->centralWidget;
if(g_iMove+g_iOneWidth*g_iNum < g_iWidth)
{
centralWidget->setGeometry(0, 0, g_iWidth, g_iHeadHigh+g_iTitleHigh+g_iCurveHigh); // 设置标签的位置和大小
}
else {
centralWidget->setGeometry(0, 0, g_iMove+g_iOneWidth*(g_iNum+1), g_iHeadHigh+g_iTitleHigh+g_iCurveHigh); // 设置标签的位置和大小
}
//道头
QString strName = "" + QString::number(g_iIndex+1);
FormHead *formHead = new FormHead(graphicsView, g_iIndex+1);
formHead->Init();
formHead->Add(strName, QColor(Qt::white));
formHead->setGeometry(g_iMove+g_iOneWidth*g_iNum, 0, g_iOneWidth, g_iHeadHigh); // 设置标签的位置和大小
formHead->setVisible(true);
//对象
FormTitle *formTitle = new FormTitle(graphicsView, g_iIndex+1);
formTitle->setGeometry(g_iMove+g_iOneWidth*g_iNum, g_iHeadHigh, g_iOneWidth, g_iTitleHigh); // 设置标签的位置和大小
formTitle->setVisible(true);
//
MyCustomPlot *curv = new MyCustomPlot(graphicsView, g_iIndex+1);
//背景设置成透明色
curv->setBackground(Qt::transparent);
curv->setStyleSheet("background: transparent;");
//curv->setGeometry(g_iOneWidth, g_iHeadHigh+g_iTitleHigh, g_iOneWidth+27, g_iCurveHigh); // 设置标签的位置和大小
curv->setGeometry(0.5+g_iOneWidth*g_iNum, g_iHeadHigh+g_iTitleHigh-15, g_iOneWidth+29, g_iCurveHigh); // 设置标签的位置和大小
curv->setVisible(true);
initForm(curv, "", g_iLineNum, formTitle);
//------------------------
scene->addWidget(formHead);
scene->addWidget(formTitle);
scene->addWidget(curv);
// 连接信号和槽
connect(formTitle, &FormTitle::sig_LineClicked, curv, &MyCustomPlot::s_LineClicked);
connect(formTitle, &FormTitle::removeSelectedGraphByTitle, curv, &MyCustomPlot::removeSelectedGraphByTitle);
//
g_iIndex++;
g_iNum++;
}
void MainWindowNew::s_addLine(int indexID)
{
qDebug() << "MainWindowNew s_addLine";
// QString strQuestion = "是否新建曲线?\n道编号" + QString::number(indexID);
// QMessageBox::StandardButton reply;
// reply = QMessageBox::question(this, "提示", strQuestion,
// QMessageBox::Yes | QMessageBox::No);
// if (reply != QMessageBox::Yes) {
// return; // 取消
// }
MyCustomPlot *widget = nullptr;
FormTitle *formTitle =nullptr;
// 获取当前widget的所有子控件
const QObjectList &children = centralWidget->children();
// 遍历子控件列表
for (QObject *child : children) {
// 判断子控件是否为QWidget类型
if (QWidget *childWidget = qobject_cast<QWidget *>(child)) {
// 打印子控件的信息,使用缩进表示层级关系
qDebug() << QString("%1").arg(childWidget->objectName());
QString strObjName = childWidget->objectName();
if(strObjName=="FormTitle")
{
FormTitle *form = (FormTitle*)childWidget;
if(form->m_indexID == indexID)
{
formTitle = form;
//break;
}
}
else if(strObjName=="MyCustomPlot")
{
MyCustomPlot *form = (MyCustomPlot*)childWidget;
if(form->m_indexID == indexID)
{
widget = form;
//break;
}
}
}
}
if(widget && formTitle)
{
QVector<double> x(g_iPointNum), y(g_iPointNum);
double xScale = (std::rand()/(double)RAND_MAX + 0.5)*2;
double yScale = (std::rand()/(double)RAND_MAX + 0.5)*2;
double xOffset = (std::rand()/(double)RAND_MAX - 0.5)*4;
double yOffset = (std::rand()/(double)RAND_MAX - 0.5)*10;
double r1 = (std::rand()/(double)RAND_MAX - 0.5)*2;
double r2 = (std::rand()/(double)RAND_MAX - 0.5)*2;
double r3 = (std::rand()/(double)RAND_MAX - 0.5)*2;
double r4 = (std::rand()/(double)RAND_MAX - 0.5)*2;
//
for (int i=0; i<g_iPointNum; i++)
{
x[i] = -i*0.1;//(i/(double)n-0.5)*10.0*xScale + xOffset;
//y[i] = ((std::rand()/(double)RAND_MAX)*30-g_iX2)*0.6;
int randomNumber = QRandomGenerator::global()->bounded(10);
y[i] = (qSin(x[i]*r1*5)*qSin(qCos(x[i]*r2)*r4*3)+r3*qCos(qSin(x[i])*r4*2))*yScale + yOffset + randomNumber*0.01;
}
QString strLineName = QString("新增曲线 %1").arg(widget->m_indexLine+1);
widget->m_indexLine++;
addRandomGraph(widget, x, y, formTitle, strLineName);
//widget->rescaleAxes();
widget->replot();
}
}
void MainWindowNew::s_delOne(int indexID)
{
QString strQuestion = "是否删除道?\n编号:" + QString::number(indexID);
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "提示", strQuestion,
QMessageBox::Yes | QMessageBox::No);
if (reply != QMessageBox::Yes) {
return; // 取消
}
// 获取当前widget的所有子控件
const QObjectList &children = centralWidget->children();
// 遍历子控件列表
for (QObject *child : children) {
// 判断子控件是否为QWidget类型
if (QWidget *childWidget = qobject_cast<QWidget *>(child)) {
// 打印子控件的信息,使用缩进表示层级关系
qDebug() << QString("%1").arg(childWidget->objectName());
QString strObjName = childWidget->objectName();
if(strObjName=="FormHead")
{
FormHead *form = (FormHead*)childWidget;
if(form->m_indexID == indexID)
{
childWidget->deleteLater(); // 安排控件的删除,稍后执行
//break;
}
}
else if(strObjName=="FormTitle")
{
FormTitle *form = (FormTitle*)childWidget;
if(form->m_indexID == indexID)
{
childWidget->deleteLater(); // 安排控件的删除,稍后执行
//break;
}
}
else if(strObjName=="MyCustomPlot")
{
MyCustomPlot *form = (MyCustomPlot*)childWidget;
if(form->m_indexID == indexID)
{
childWidget->deleteLater(); // 安排控件的删除,稍后执行
//break;
}
}
}
}
//暂时不处理删除,坐标调整
//g_iNum--;
//centralWidget->setGeometry(0, 0, g_iMove+g_iOneWidth*g_iNum, g_iHeadHigh+g_iTitleHigh+g_iCurveHigh); // 设置标签的位置和大小
}
void MainWindowNew::s_SaveImg()
{
QString strQuestion = "是否保存图像?";
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "提示", strQuestion,
QMessageBox::Yes | QMessageBox::No);
if (reply != QMessageBox::Yes) {
return; // 取消
}
// 1.获取当前运行程序的目录路径
QString applicationDirPath = QCoreApplication::applicationDirPath();
QString configPath;
configPath = applicationDirPath + "/1.png";
//指标体系图
QPixmap pCenter = centralWidget->grab(QRect(0, 0, centralWidget->width(), centralWidget->height()));
//pCenter.save(configPath, "png");
QPixmap pImageHead = m_ImageHeadTable->grab(QRect(0, 0, m_ImageHeadTable->width(), m_ImageHeadTable->height()));
// 创建一个足够大的QPixmap作为画布
int width = std::max({pImageHead.width(), pCenter.width()});// 最大宽度
int height = pImageHead.height()+ pCenter.height(); // 总高度
QPixmap result(width, height);
result.fill(Qt::transparent); // 填充背景为透明,或者使用其他颜色填充背景
// 使用QPainter绘制小QPixmap
QPainter painter(&result);
painter.drawPixmap(0, 0, pImageHead); // 在(0,0)位置绘制pixmap1
painter.drawPixmap(0, pImageHead.height(), pCenter); // 在pixmap1右侧绘制pixmap2
//painter.drawPixmap(pixmap1.width() + pixmap2.width(), 0, pixmap3); // 在右侧继续绘制pixmap3
result.save(configPath, "png");
}
void MainWindowNew::s_DrawImg()
{
QString strQuestion = "是否画图?";
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "提示", strQuestion,
QMessageBox::Yes | QMessageBox::No);
if (reply != QMessageBox::Yes) {
return; // 取消
}
FormDraw *formDraw = new FormDraw(centralWidget);
//formDraw->setStyleSheet("QWidget { background-color: red; }");
formDraw->setGeometry(100, g_iHeadHigh+g_iTitleHigh+200, 200, 200); // 设置标签的位置和大小
formDraw->setVisible(true);
}
void MainWindowNew::s_DrawLine()
{
QString strQuestion = "是否画线?";
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "提示", strQuestion,
QMessageBox::Yes | QMessageBox::No);
if (reply != QMessageBox::Yes) {
return; // 取消
}
FormLine *formLine = new FormLine(centralWidget);
formLine->setGeometry(100, g_iHeadHigh+g_iTitleHigh+100, 200, 2); // 设置标签的位置和大小
formLine->setVisible(true);
}
//停靠
void MainWindowNew::dockLayout()
{
//
QDockWidget *dockImageHead=new QDockWidget(tr(""),this);
//停靠窗口4
dockImageHead->setFeatures(QDockWidget::DockWidgetClosable);//|QDockWidget::DockWidgetFloatable
//dockImageHead->setAllowedAreas(Qt::TopDockWidgetArea);
QWidget *dockWidgetContents = new QWidget();
//dockWidgetContents->setGeometry(0,0,800,400);
if(!m_ImageHeadTable)
{
m_ImageHeadTable = new QTableWidget(dockWidgetContents);
m_ImageHeadTable->setMinimumSize(1100,300);
//清空
m_ImageHeadTable->clearContents();
//
m_ImageHeadTable->verticalHeader()->hide();
m_ImageHeadTable->horizontalHeader()->hide();
//因为tableWidget需要提前规定好行数与列数
int rowcount = 3; //总行数
int columnCount = 5;//总列数
m_ImageHeadTable->setColumnCount(columnCount);
m_ImageHeadTable->setRowCount(rowcount); //动态设置行数
for(int i=0; i<rowcount; i++)
{
for(int j=0; j<columnCount; j++)
{
QTableWidgetItem* item = new QTableWidgetItem("");
m_ImageHeadTable->setItem(i, j, item);
}
}
// 设置右键菜单策略
m_ImageHeadTable->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_ImageHeadTable, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
}
//-----
QVBoxLayout *layout = new QVBoxLayout(dockWidgetContents);
// 将你的widget添加到布局中
layout->addWidget(m_ImageHeadTable, 1, Qt::AlignCenter); // 使用Qt::AlignCenter进行居中
layout->setAlignment(Qt::AlignCenter); // 设置整个布局的居中
dockImageHead->setWidget(dockWidgetContents);
//-----
//dockImageHead->setWidget(m_ImageHeadTable);
addDockWidget(Qt::TopDockWidgetArea, dockImageHead);
}
void MainWindowNew::slotContextMenu(QPoint pos)
{
// 获取点击位置的 QTableWidgetItem
QTableWidgetItem *item = m_ImageHeadTable->itemAt(pos);
// 判断是否点击在有效数据区域
//if (item) {
if(1) {
QMenu menu(m_ImageHeadTable);
QAction *mergeAction = menu.addAction("合并表格");
QAction *refreshAction = menu.addAction("拆分表格");
QAction *deleteAction = menu.addAction("删除行");
QAction *addAction = menu.addAction("添加行");
// 弹出菜单
QAction *selectedAction = menu.exec(m_ImageHeadTable->mapToGlobal(pos));
if (selectedAction == mergeAction) {
qDebug() << "合并表格";
slotMerge();
} else if (selectedAction == deleteAction) {
int row = m_ImageHeadTable->currentRow();
m_ImageHeadTable->removeRow(row);
} else if (selectedAction == refreshAction) {
qDebug() << "拆分表格";
slotSplit();
}
} else {
// 点击在无效区域,不弹出菜单
qDebug() << "点击在无效区域,不弹出菜单";
}
}
//合并
void MainWindowNew::slotMerge()
{
QModelIndexList list = m_ImageHeadTable->selectionModel()->selectedIndexes();
if (list.size() < 2)
{
QMessageBox::warning(this, "单元格合并", "所选中单元格中为单个单元格,无法合并", "确定");
return;
}
int topRow = 0;
int leftCol = 0;
int bottomRow = 0;
int rightCol = 0;
QList<QTableWidgetSelectionRange> selectRanges = m_ImageHeadTable->selectedRanges();
if (selectRanges.size() > 0)
{
topRow = selectRanges[0].topRow();
leftCol = selectRanges[0].leftColumn();
bottomRow = selectRanges[0].bottomRow();
rightCol = selectRanges[0].rightColumn();
}
for(auto range:selectRanges)
{
if(range.topRow()<topRow)
topRow=range.topRow();
if(range.leftColumn()<leftCol)
leftCol=range.leftColumn();
if(range.bottomRow()> bottomRow)
bottomRow=range.bottomRow();
if(range.rightColumn()>rightCol)
rightCol=range.rightColumn();
}
int rowSpan = (bottomRow - topRow) + 1;
int colSpan = (rightCol - leftCol) + 1;
m_ImageHeadTable->setSpan(topRow, leftCol, rowSpan, colSpan);
}
//拆分
void MainWindowNew::slotSplit()
{
int row,col;
QList<QTableWidgetSelectionRange> selectRanges = m_ImageHeadTable->selectedRanges();
if (selectRanges.size() < 2)
{
QMessageBox::warning(this, "拆分表格失败", "单元格已是最小单位,不能再进行拆分", "确定");
return;
}
QList<QTableWidgetItem*> selectItems = m_ImageHeadTable->selectedItems();
if(selectItems.size()==0)
{
QMessageBox::warning(this, "拆分表格失败", "请先为表格设置元素item", "确定");
return;
}
if(selectItems.size()>1)
{
QMessageBox::warning(this, "拆分表格失败", "非法选择", "确定");
return;
}
for(auto item:selectItems)
{
row= item->row();
col=item->column();
}
m_ImageHeadTable->setSpan(row, col, 1, 1); // 设置跨度为1
}