优化大量曲线上下滚动卡顿问题

This commit is contained in:
jiayulong 2026-04-28 11:05:59 +08:00
parent 8c7bf0fed0
commit 1e4d815759
7 changed files with 139 additions and 45 deletions

View File

@ -176,6 +176,8 @@ signals:
//改变缩放比例
void sig_changeScale(QString strUuid, int iNewScale);
//自定义滚动条
void sig_vertScrollBarChanged_setGeometry(QString strUuid, int iNewValue, int low, int upper);
//自定义滚动条
void sig_vertScrollBarChanged(QString strUuid, int iNewValue, int low, int upper);

View File

@ -13,6 +13,7 @@
#include "formline.h"
#include "PropertyWidget.h"
#include "DrawTvd.h"
#include "DepthProgress.h"
//以下参数从配置文件读取
extern int g_iOneWidth; //道宽
@ -480,6 +481,11 @@ void FormDraw::DisplayLines(QJsonArray linesArray)
}
}
//进度提示
char s[200];
DepthProgress mDepthProgress;
mDepthProgress.CreatProgress(0, iCount,"加载..");
for (int id = 0; id < iCount; id++)
{
if (mapLines.contains(id))
@ -578,10 +584,16 @@ void FormDraw::DisplayLines(QJsonArray linesArray)
{
DisplayType_One(lineObjInfo);
}
//中间
sprintf(s,"加载中,共计%d条正在加载第%d条..", iCount, id);
mDepthProgress.SetShowName(s);
mDepthProgress.SetDepth(id);
}
}
}
}
//
mDepthProgress.DelProgress();
}
// 岩心分析

View File

@ -170,8 +170,9 @@ void MainWindow::ReadConfig()
qtCommon->readShowScale(configPath, iShow);
g_iShow = iShow;
//(0:采用最大30000像素高度 1:采用屏幕工作区域高度, 其他数字高度采用g_iHeight_MyCustom的值)
int iHeight = 10000;
//读取,MyCustom界面高度
int iHeight = 1;
//qtCommon->readHeight(configPath, iHeight);
g_iHeight_MyCustom = iHeight;

View File

@ -222,8 +222,53 @@ void MainWindowCurve::s_mouseWheel(QWheelEvent *event)
//自定义滚动条
void MainWindowCurve::vertScrollBarChanged(int value)
{
//通知界面缩放
emit CallManage::getInstance()->sig_vertScrollBarChanged(m_strUuid, value, -m_iY1, -m_iY2);
int low = -m_iY1;
int upper = -m_iY2;
int iHeightOfScreen = 30000;//QApplication::desktop()->height();
if(g_iHeight_MyCustom == 0)
{
iHeightOfScreen = 30000;
}
else if(g_iHeight_MyCustom == 1)
{
iHeightOfScreen = g_WorkSpace_Height;
}
else
{
iHeightOfScreen = g_iHeight_MyCustom;
}
double dScrollHeight = (iHeightOfScreen-g_WorkSpace_Height)/g_dPixelPerCm/100.0 * (double)m_iScale;
double dScrollHeight_setGeometry = iHeightOfScreen/g_dPixelPerCm/100.0 * (double)m_iScale;
//
double dDelta = value - upper;
int iNumShow = dDelta/dScrollHeight;
if(dDelta - (iNumShow * dScrollHeight) > 0)
{
iNumShow++;
}
if(m_iCurPage == iNumShow)
{
int iCurValue = dDelta - (iNumShow-1)*dScrollHeight;
//通知界面重设范围
emit CallManage::getInstance()->sig_vertScrollBarChanged_setGeometry(m_strUuid, iCurValue, dScrollHeight_setGeometry, 0);
}
else if(iNumShow>0)
{
m_iCurPage = iNumShow;
//通知界面重设范围
emit CallManage::getInstance()->sig_vertScrollBarChanged(m_strUuid, (iNumShow-1)*dScrollHeight_setGeometry, -m_iY1, -m_iY2);
// //
// int iCurValue = dDelta - (iNumShow-1)*dScrollHeight;
// //通知界面重设范围
// emit CallManage::getInstance()->sig_vertScrollBarChanged_setGeometry(m_strUuid, iCurValue, dScrollHeight, 0);
}
//通知界面重设范围
//emit CallManage::getInstance()->sig_vertScrollBarChanged(m_strUuid, value, -m_iY1, -m_iY2);
}
@ -2562,15 +2607,15 @@ void copyFile(const QString &sourcePath, const QString &destinationPath) {
// =4 to svg
void MainWindowCurve::_slotExport(QPrinter &printer, int IsBmp, QString pngName, QString strTmpName)
{
//Small模式出图的原始图片是否采用小图片(默认0:大图--缺点出图时占用内存大, 1:小图--缺点小图拼接容易有缝隙)
if(g_iSmallPrint==0)
{
//首先调整为最大图,减少打印空隙
//MyCustom界面高度g_iHeight_MyCustom的值 (0:采用最大30000像素高度 1:采用屏幕工作区域高度, 其他数字高度采用g_iHeight_MyCustom的值)
g_iHeight_MyCustom = 0;
//打印出图,改变深度
changeDepthForPrint();
}
// //Small模式出图的原始图片是否采用小图片(默认0:大图--缺点出图时占用内存大, 1:小图--缺点小图拼接容易有缝隙)
// if(g_iSmallPrint==0)
// {
// //首先调整为最大图,减少打印空隙
// //MyCustom界面高度g_iHeight_MyCustom的值 (0:采用最大30000像素高度 1:采用屏幕工作区域高度, 其他数字高度采用g_iHeight_MyCustom的值)
// g_iHeight_MyCustom = 0;
// //打印出图,改变深度
// changeDepthForPrint();
// }
printer.setPageMargins(0.0,0.0,0.0,0.0,QPrinter::DevicePixel);
@ -2815,6 +2860,8 @@ void MainWindowCurve::_slotExport(QPrinter &printer, int IsBmp, QString pngName,
images.append(convertToQImage(pPixmap_wellTrackInfo)); // 将QPixmap转换为QImage并存储到列表中
}
double newValue = 0;
double newValue_last = 0;
//int iPreH = 6;
int iLoop = 0;
for(iLoop = 0; iLoop<iNum; iLoop++)
@ -2831,7 +2878,12 @@ void MainWindowCurve::_slotExport(QPrinter &printer, int IsBmp, QString pngName,
// {
// newValue = (tmp-iPreH*iLoop)/g_dPixelPerCm/100.0 * (double)m_iScale;
// }
ui->verticalScrollBar->setValue(newValue);//设置右侧滚动条
newValue_last = newValue;
//ui->verticalScrollBar->setValue(newValue);//设置右侧滚动条
//通知界面重设范围
emit CallManage::getInstance()->sig_vertScrollBarChanged(m_strUuid, newValue, -m_iY1, -m_iY2);
if(iLoop==iNum-1)
{
//最后1页
@ -2961,16 +3013,17 @@ void MainWindowCurve::_slotExport(QPrinter &printer, int IsBmp, QString pngName,
mDepthProgress.DelProgress();
//Small模式出图的原始图片是否采用小图片(默认0:大图--缺点出图时占用内存大, 1:小图--缺点小图拼接容易有缝隙)
if(g_iSmallPrint==0)
{
//恢复调整为最小图,减少卡顿
//MyCustom界面高度g_iHeight_MyCustom的值 (0:采用最大30000像素高度 1:采用屏幕工作区域高度, 其他数字高度采用g_iHeight_MyCustom的值)
g_iHeight_MyCustom = 1;
//打印出图,改变深度
changeDepthForPrint();
}
// if(g_iSmallPrint==0)
// {
// //恢复调整为最小图,减少卡顿
// //MyCustom界面高度g_iHeight_MyCustom的值 (0:采用最大30000像素高度 1:采用屏幕工作区域高度, 其他数字高度采用g_iHeight_MyCustom的值)
// g_iHeight_MyCustom = 1;
// //打印出图,改变深度
// changeDepthForPrint();
// }
ui->verticalScrollBar->setValue(-m_iY2);//设置右侧滚动条
//ui->verticalScrollBar->setValue(-m_iY1);//设置右侧滚动条
ui->verticalScrollBar->setValue(newValue_last);//设置右侧滚动条
if(bOK)
{
QMessageBox::information(NULL,"提示","图件输出完成!",QMessageBox::Ok);
@ -4144,8 +4197,11 @@ void MainWindowCurve::Open(QString fileFull)
//重置右侧滚动条
ui->verticalScrollBar->setRange(-m_iY2, -m_iY1);
ui->verticalScrollBar->setValue(-m_iY2);
QMessageBox::information(NULL,"提示","模板加载完成!",QMessageBox::Ok);
} else {
qWarning() << "JSON 模板文件打开失败:" << file.errorString();
QMessageBox::information(NULL,"提示","模板加载失败!",QMessageBox::Ok);
}
}
@ -4419,16 +4475,31 @@ void MainWindowCurve::changeDepthForPrint()
progressBar->hide();
double dHight = 0;
dHight = (m_iY2-m_iY1)*100.0/(double)m_iScale * g_dPixelPerCm;
if(g_iShow==1)
// double dHight = 0;
// dHight = (m_iY2-m_iY1)*100.0/(double)m_iScale * g_dPixelPerCm;
// if(g_iShow==1)
// {
// //显示刻度
// dHight = dHight+30;
// }
// if(dHight>32767)
// {
// dHight = 32767;
// }
// 屏幕高度
int iHeightOfScreen = 30000;//QApplication::desktop()->height();
if(g_iHeight_MyCustom == 0)
{
//显示刻度
dHight = dHight+30;
iHeightOfScreen = 30000;
}
if(dHight>32767)
else if(g_iHeight_MyCustom == 1)
{
dHight = 32767;
iHeightOfScreen = g_WorkSpace_Height;
}
else
{
iHeightOfScreen = g_iHeight_MyCustom;
}
//--------------------
@ -4456,26 +4527,12 @@ void MainWindowCurve::changeDepthForPrint()
FormWell *widgetWell = (FormWell*)myWidget;//获得widget
if(widgetWell)
{
widgetWell->setRowHeight(dHight, progressBar, iSplit);
widgetWell->setRowHeight(iHeightOfScreen, progressBar, iSplit);
}
}
}
}
// 屏幕高度
int iHeightOfScreen = 30000;//QApplication::desktop()->height();
if(g_iHeight_MyCustom == 0)
{
iHeightOfScreen = 30000;
}
else if(g_iHeight_MyCustom == 1)
{
iHeightOfScreen = g_WorkSpace_Height;
}
else
{
iHeightOfScreen = g_iHeight_MyCustom;
}
//
//获取井well前2行的高度
int iTableSize_Head = 100 + m_nObjLayerH;

View File

@ -91,7 +91,7 @@ public:
int m_iScale=200;
double m_iY1=-1000;
double m_iY2=0;
int m_iCurPage = 1;//当前页
public:
//展示所有井
void DisplayWells(QJsonArray wellsArray);

View File

@ -11910,6 +11910,25 @@ void QMyCustomPlot::addQCPItemLine(QMyCustomPlot *widget, float cx, float cy, co
pLine->setPoints(myPolygon);
}
void QMyCustomPlot::vertScrollBarChanged_setGeometry(QString strUuid, int value, int low, int upper)
{
if(m_strUuid==strUuid)
{
}
else
{
return;
}
//上移或下移
QRect geoRect = geometry();
//
double dDelta = value; //- upper
double dPercent = dDelta / (low-upper);
setGeometry(0, -(dPercent*geoRect.height()), geoRect.width(), geoRect.height());
return;
}
//自定义滚动条
void QMyCustomPlot::vertScrollBarChanged(QString strUuid, int value, int low, int upper)
{
@ -11920,6 +11939,8 @@ void QMyCustomPlot::vertScrollBarChanged(QString strUuid, int value, int low, in
{
return;
}
QRect geoRect = geometry();
setGeometry(0, 0, geoRect.width(), geoRect.height());
//
FormInfo* pInfo = m_formTrack->getFormInfoByParameters(m_strUuid, m_strWellName, m_strTrackName, m_strLineName);

View File

@ -408,6 +408,7 @@ public slots:
void slot_time();
//自定义滚动条
void vertScrollBarChanged(QString strUuid, int value, int low, int upper);
void vertScrollBarChanged_setGeometry(QString strUuid, int value, int low, int upper);
//信号槽刷新
void slot_replot();