QT 笔记:禁止调整窗口大小

本文介绍如何使用Qt的setFixedSize方法来禁用窗口大小调整功能,并提供了一个具体的代码示例。此外,还讨论了这种方法在不同操作系统上的表现。

Qt 是一个跨平台的、基于 LGPL 协议的界面类库,可以方便地实现 C++ 的可视化窗口编程,在很大程度上弥补了 C++ 语言界面编程的弱点。

由于要支持跨平台,一些基于平台的功能就不能直接写入类库,导致了使用 Qt 时一些功能需要变通的方法来实现。

比如:Qt 并不支持直接禁止用户调整窗口大小。变通的方法是将窗口的最小大小和最大大小设置为一样。

为了更方便,QWidget 类实现了 setFixedSize(int w, int h) 方法,该方法的实质就是将窗口的大小、最小大小、最大大小设置为相同的值。

唯一的缺憾是,通过这种方法实现的窗口固定大小的效果不是很完美,比如,在 Windows 操作系统下,在窗口边框处仍然提示可以拉动窗口以改变大小,但是拉动时却拉不动。

? [Copy to clipboard] Download mainwindow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "mainwindow.h"

#include "ui_mainwindow.h"

 
MainWindow::
MainWindow
(
QWidget *
parent)
 :

    QMainWindow(
parent)
,
    ui(
new
 Ui::
MainWindow
)

{

    ui-
>
setupUi(
this
)
;

    Qt::
WindowFlags
 flags =
 0
;

    flags |
=
 Qt::
WindowMinimizeButtonHint
;

    setWindowFlags(
flags)
;
 // 设置禁止最大化

    setFixedSize(
577
,433
)
;
 // 禁止改变窗口大小。

}

 
MainWindow::
~MainWindow(
)

{

    delete
 ui;

}

 
void
 MainWindow::
changeEvent
(
QEvent *
e)

{

    QMainWindow::
changeEvent
(
e)
;

    switch
 (
e-
>
type(
)
)
 {

    case
 QEvent::
LanguageChange
:

        ui-
>
retranslateUi(
this
)
;

        break
;

    default
:

        break
;

    }

}

您也许喜欢

  1. C++笔记:习题 6.20
  2. std::vector : 用法与技巧
  3. C++笔记:使用std::vector储存质数表
  4. C++笔记:[程序]反转所给的字符串
  5. C++笔记:入门
  6. 使用 OleDB 实现远程多线程数据库访问(C#, Access 数据库)
#include "DataPretreatmentWidget.h" #include <QSplitter> #include <QHBoxLayout> #include <QVBoxLayout> #include <QGridLayout> #include <QDebug> #include <QFontDatabase> #include <QOpenGLWidget> #include "common.h" #include "appevent.h" DataPretreatmentWidget::DataPretreatmentWidget(int groupNo, QWidget *parent, DataPretreatmentType pretreatmentType) : QWidget(parent), m_dataPretreatmentType(pretreatmentType), m_groupNo(groupNo) { initUI(); switch (m_dataPretreatmentType) { case DataPretreatmentType::GammaPlot: m_title = tr("伽马数据预处理"); break; case DataPretreatmentType::PresurePlot: m_title = tr("压力数据预处理"); break; case DataPretreatmentType::ShakePlot: m_title = tr("震动数据预处理"); break; case DataPretreatmentType::DirecteAnglePlot: m_title = tr("方位角数据预处理"); break; case DataPretreatmentType::SlantAnglePlot: m_title = tr("倾角数据预处理"); break; } m_plotWidget->on_updateTitle(m_title); } /** * @brief LithologyHierachyWidget::initUI * 初始化界面布局 */ void DataPretreatmentWidget::initUI() { m_plotWidget = new DataPretreatmentPlot(this); m_settingWidget = new DataPretreatmentSetting(this); connect(m_settingWidget, SIGNAL(updateImagePara(ImageLayout, DataPretreatmentFont)), m_plotWidget, SLOT(on_updateImagePara(ImageLayout, DataPretreatmentFont))); connect(m_settingWidget, SIGNAL(updatePlotColor(DataPretreatmentPlotColor)), m_plotWidget, SLOT(on_updatePlotColor(DataPretreatmentPlotColor))); connect(m_settingWidget, SIGNAL(updateShowPlot(bool, bool)), m_plotWidget, SLOT(on_updateShowPlot(bool, bool))); connect(m_settingWidget, SIGNAL(updateFilter()), this, SLOT(on_updateFilter())); connect(m_settingWidget, SIGNAL(updateReset()), this, SLOT(on_updateReset())); m_settingWidget->on_updateImagePara(); // 根据默认参数刷新图表 m_settingWidget->on_updatePlotColor(); // 根据默认参数刷新图表颜色 QSplitter *splitter = new QSplitter(); splitter->setStyleSheet("QSplitter {background-color: #E6EDF7;border: 0px solid #d0d0d0;}" "QSplitter::handle {width: 8px;background-color: #ffff00;border: 1px solid #c0c0c0;}"); splitter->addWidget(m_plotWidget); splitter->addWidget(m_settingWidget); QHBoxLayout *allLayout = new QHBoxLayout; allLayout->setSpacing(0); allLayout->setContentsMargins(0, 0, 0, 0); allLayout->addWidget(splitter); this->setLayout(allLayout); } /**获取导出图片的名称**/ QString DataPretreatmentWidget::getExportImageName() { return m_title; } /**离开界面**/ void DataPretreatmentWidget::leave() { m_plotWidget->leave(); } /**进入界面**/ void DataPretreatmentWidget::enter() { m_plotWidget->enter(); } /**序列化参数**/ void DataPretreatmentWidget::toJson(QJsonObject &obj) { obj.insert("Image", ImageLayout::toJson(m_settingWidget->getImageLayout())); obj.insert("Font", DataPretreatmentFont::toJson(m_settingWidget->getLithologyHierachyFont())); obj.insert("Color", DataPretreatmentPlotColor::toJson(m_settingWidget->getLithologyHierachyPlotColor())); } /**反序列化参数**/ void DataPretreatmentWidget::fromJson(const QJsonObject &obj) { m_settingWidget->setImageLayout(ImageLayout::fromJson(obj.value("Image").toObject())); m_settingWidget->setLithologyHierachyFont(DataPretreatmentFont::fromJson(obj.value("Font").toObject())); m_settingWidget->setLithologyHierachyPlotColor(DataPretreatmentPlotColor::fromJson(obj.value("Color").toObject())); } bool DataPretreatmentWidget::exportImage(QString dir) { bool isSuccess = false; m_plotWidget->on_exportImage(dir, isSuccess); return isSuccess; } void DataPretreatmentWidget::refresh() { if (m_plotWidget) { m_plotWidget->on_refresh(); } } void DataPretreatmentWidget::setOriginalData(const QVector<std::shared_ptr<MetaItem>> &arrayData) { if (arrayData.size() <= 0) { return; } QList<DepthValue> depthValueBuff; float maxDepth = -9999999.0f; float maxValue = -9999999.0f; float minDepth = 0.0f; float minValue = 9999999.0f; switch (m_dataPretreatmentType) { case DataPretreatmentType::GammaPlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_gamma))); break; case DataPretreatmentType::PresurePlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_pressure))); break; case DataPretreatmentType::ShakePlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_ypathB))); break; case DataPretreatmentType::DirecteAnglePlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_directeAngle))); break; case DataPretreatmentType::SlantAnglePlot: depthValueBuff.append(DepthValue(0.0f, arrayData.at(0)->_slantAngle)); break; } for (int i = 0; i < arrayData.size(); i++) { float value = 0; switch (m_dataPretreatmentType) { case DataPretreatmentType::GammaPlot: value = arrayData.at(i)->_gamma; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = 300.0f; minValue = -10.0f; break; case DataPretreatmentType::PresurePlot: value = arrayData.at(i)->_pressure; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = 16.0f; minValue = -16.0f; break; case DataPretreatmentType::ShakePlot: value = arrayData.at(i)->_ypathB; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = maxValue > value ? maxValue : value; minValue = minValue < value ? minValue : value; break; case DataPretreatmentType::DirecteAnglePlot: value = arrayData.at(i)->_directeAngle; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = 360.0f; minValue = -90.0f; break; case DataPretreatmentType::SlantAnglePlot: value = arrayData.at(i)->_slantAngle; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, value)); maxValue = 90.0f; minValue = -90.0f; break; } maxDepth = maxDepth > arrayData.at(i)->_depth ? maxDepth : arrayData.at(i)->_depth; minDepth = minDepth<arrayData.at(i)->_depth?minDepth:arrayData.at(i)->_depth; } if(m_dataPretreatmentType == DataPretreatmentType::ShakePlot) { maxValue += 10.0f; minValue -= 10.0f; } m_plotWidget->on_updateOriginalPlotData(depthValueBuff, minDepth, maxDepth, minValue, maxValue); } void DataPretreatmentWidget::updateData(const QVector<std::shared_ptr<MetaItem>> &arrayData) { if(arrayData.size() <= 0) { return; } QList<DepthValue> depthValueBuff; float maxDepth = -9999999.0f; float maxValue = -9999999.0f; float minDepth = 0.0f; float minValue = 9999999.0f; switch (m_dataPretreatmentType) { case DataPretreatmentType::GammaPlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_gamma))); break; case DataPretreatmentType::PresurePlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_pressure))); break; case DataPretreatmentType::ShakePlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_ypathB))); break; case DataPretreatmentType::DirecteAnglePlot: depthValueBuff.append(DepthValue(0.0f, qAbs(arrayData.at(0)->_directeAngle))); break; case DataPretreatmentType::SlantAnglePlot: depthValueBuff.append(DepthValue(0.0f, arrayData.at(0)->_slantAngle)); break; } for (int i = 0; i < arrayData.size(); i++) { float value = 0; switch (m_dataPretreatmentType) { case DataPretreatmentType::GammaPlot: value = arrayData.at(i)->_gamma; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = 300.0f; minValue = -10.0f; break; case DataPretreatmentType::PresurePlot: value = arrayData.at(i)->_pressure; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = 16.0f; minValue = -16.0f; break; case DataPretreatmentType::ShakePlot: value = arrayData.at(i)->_ypathB; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = maxValue > value ? maxValue : value; minValue = minValue < value ? minValue : value; break; case DataPretreatmentType::DirecteAnglePlot: value = arrayData.at(i)->_directeAngle; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, qAbs(value))); maxValue = 360.0f; minValue = -90.0f; break; case DataPretreatmentType::SlantAnglePlot: value = arrayData.at(i)->_slantAngle; depthValueBuff.append(DepthValue(arrayData.at(i)->_depth, value)); maxValue = 90.0f; minValue = -90.0f; break; } maxDepth = maxDepth > arrayData.at(i)->_depth ? maxDepth : arrayData.at(i)->_depth; minDepth = minDepth < arrayData.at(i)->_depth ? minDepth : arrayData.at(i)->_depth; } if(m_dataPretreatmentType == DataPretreatmentType::ShakePlot) { maxValue += 10.0f; minValue -= 10.0f; } m_plotWidget->on_updatePlotData(depthValueBuff, minDepth, maxDepth, minValue, maxValue); } void DataPretreatmentWidget::on_updateReset() { DataMagrSingleton::GetInstance()->resetFilteredData(m_groupNo, this); } void DataPretreatmentWidget::on_updateFilter() { // 禁止方位角倾角过滤 if (m_dataPretreatmentType == DirecteAnglePlot || m_dataPretreatmentType == SlantAnglePlot || m_dataPretreatmentType == GammaPlot) { return; } int M = m_settingWidget->getCurSgNumber(); DataMagrSingleton::GetInstance()->sg_filter(m_groupNo, this, M); } /************************************************绘图区域表头*************/ DataPretreatmentTitlePlot::DataPretreatmentTitlePlot(QGraphicsItem *parent) : QGraphicsItem(parent) { } void DataPretreatmentTitlePlot::setCurveSize(const float &maxWidthPix) { m_widthPix = maxWidthPix; } void DataPretreatmentTitlePlot::setFont(QFont titleFont, QFont tableTitleFont) { m_titleFont = titleFont; // 标题字体 m_tableTitleFont = tableTitleFont; // 表头字体 m_highPix = getTitleHeight(); update(); } float DataPretreatmentTitlePlot::getTitleHeight() { return (m_titleFont.pixelSize() + m_tableTitleFont.pixelSize() * 2) * FONTSIZESCALE; } QRectF DataPretreatmentTitlePlot::boundingRect() const { return QRectF(0, 0, m_widthPix, m_highPix); } void DataPretreatmentTitlePlot::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); painter->setPen(QPen(Qt::black, 3)); painter->drawRect(QRectF(0, 0, m_widthPix, m_highPix)); float startHightPosition = 0; /**绘制标题**/ painter->setFont(m_titleFont); painter->drawRect(QRectF(0, startHightPosition, m_widthPix, m_titleFont.pixelSize() * FONTSIZESCALE)); painter->drawText(QRectF(0, startHightPosition, m_widthPix, m_titleFont.pixelSize() * FONTSIZESCALE), Qt::AlignCenter, m_title); startHightPosition += m_titleFont.pixelSize() * FONTSIZESCALE; float widthPositon = 0; /**绘制原始数据名称标题**/ painter->setFont(m_tableTitleFont); painter->setPen(QPen(Qt::black, 1)); painter->drawRect(QRectF(widthPositon, startHightPosition, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE)); painter->drawText(QRectF(widthPositon, startHightPosition, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignCenter, tr("原始数据曲线")); painter->drawRect(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE)); painter->drawText(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignVCenter | Qt::AlignLeft, QString::number(m_startOriginal, 'f', 1)); painter->drawText(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignVCenter | Qt::AlignHCenter, tr("-")); painter->drawText(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignVCenter | Qt::AlignRight, QString::number(m_endOriginal, 'f', 1)); widthPositon = m_widthPix / 2.0; /**绘制预处理数据名称标题**/ painter->setPen(QPen(Qt::black, 1)); painter->drawRect(QRectF(widthPositon, startHightPosition, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE)); painter->drawText(QRectF(widthPositon, startHightPosition, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignCenter, tr("预处理数据曲线")); painter->drawRect(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE)); painter->drawText(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignVCenter | Qt::AlignLeft, QString::number(m_startPreData, 'f', 1)); painter->drawText(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignVCenter | Qt::AlignHCenter, tr("-")); painter->drawText(QRectF(widthPositon, startHightPosition + m_tableTitleFont.pixelSize() * FONTSIZESCALE, m_widthPix / 2.0, m_tableTitleFont.pixelSize() * FONTSIZESCALE), Qt::AlignVCenter | Qt::AlignRight, QString::number(m_endPreData, 'f', 1)); } /************************************************绘图区域*************/ #include <QHBoxLayout> #include <QGraphicsRectItem> #include "Custom/module/OpenGraphicsScene.h" #include "Custom/module/OpenGraphicsView.h" DataPretreatmentPlot::DataPretreatmentPlot(QWidget *parent) : QWidget(parent) { initUI(); } /** * @brief LithologyHierachyWidget::initUI * 初始化界面布局 */ void DataPretreatmentPlot::initUI() { scene = new OpenGraphicsScene(); OpenGraphicsView *view = new OpenGraphicsView(this); view->setMouseTrack(true); connect(view, SIGNAL(mousePosChanged(QPointF)), scene, SLOT(onMouseChanged(QPointF))); // 鼠标移动绘制十字 connect(view, SIGNAL(mouseChoosePos(QPointF)), scene, SLOT(onMouseChoosePos(QPointF))); // 双击绘制岩层分割线 view->setScene(scene); view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); /// 抗锯齿 /**添加表头**/ m_lithologyHierachyTitlePlot = new DataPretreatmentTitlePlot(); scene->addItem(m_lithologyHierachyTitlePlot); /**比例尺图**/ m_measureScaleItem = new MeasureScaleItem(); scene->addItem(m_measureScaleItem); /**原始数据**/ m_originalDataCurveItem = new DepthCurveItem(); connect(view, SIGNAL(mousePosChanged(QPointF)), m_originalDataCurveItem, SLOT(onMouseChanged(QPointF))); connect(scene, SIGNAL(updateSaveImgEvent(bool)), m_originalDataCurveItem, SLOT(onSaveImgEvent(bool))); ; m_originalDataCurveItem->setPaintRulerLine(true, 10); scene->addItem(m_originalDataCurveItem); /**预处理图**/ m_pretreatmentDataCurveItem = new DepthCurveItem(); connect(view, SIGNAL(mousePosChanged(QPointF)), m_pretreatmentDataCurveItem, SLOT(onMouseChanged(QPointF))); connect(scene, SIGNAL(updateSaveImgEvent(bool)), m_pretreatmentDataCurveItem, SLOT(onSaveImgEvent(bool))); m_pretreatmentDataCurveItem->setPaintRulerLine(true, 10); scene->addItem(m_pretreatmentDataCurveItem); QHBoxLayout *layout = new QHBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(1, 1, 1, 1); layout->addWidget(view, 1); this->setLayout(layout); } void DataPretreatmentPlot::on_exportImage(QString path, bool &isSuccess, int borderSise) { scene->exportImage(path, isSuccess, borderSise); } /** * @brief on_updateImagePara * @param imageLayout * @param lithologyHierachyFont * 更新图像参数 */ void DataPretreatmentPlot::on_updateImagePara(ImageLayout imageLayout, DataPretreatmentFont lithologyHierachyFont) { m_imageLayout = imageLayout; m_lithologyHierachyFont = lithologyHierachyFont; on_refresh(); } void DataPretreatmentPlot::on_updatePlotColor(DataPretreatmentPlotColor color) { m_lithologyHierachyPlotColor = color; on_refresh(); } void DataPretreatmentPlot::on_updateShowPlot(bool isShowOriPlot, bool isShowPrePlot) { m_isShowOriPlot = isShowOriPlot; m_isShowPrePlot = isShowPrePlot; on_refresh(); } /** * 刷新界面 */ void DataPretreatmentPlot::on_refresh() { float titleHight = 0; float plotHeight = m_imageLayout.heightPix - m_imageLayout.TBBorderPix * 2 - titleHight; float plotWidth = m_imageLayout.widthPix - m_imageLayout.LRBorderPix * 2; float startWidth = m_imageLayout.LRBorderPix; /** *横向分为16分,其中地质图,伽马,震动,压力各站3分,厚度,范围,解释工站4分 *16=4*3 +4 */ /**绘制标题栏**/ { m_lithologyHierachyTitlePlot->setFont(m_lithologyHierachyFont.titleFont, m_lithologyHierachyFont.tableTitleFont); m_lithologyHierachyTitlePlot->setCurveSize(plotWidth); m_lithologyHierachyTitlePlot->setPos(startWidth, 0); titleHight = m_lithologyHierachyTitlePlot->getTitleHeight(); } /**刷新原始数据图**/ if (m_isShowOriPlot) { float width = plotWidth / 2.0; m_originalDataCurveItem->updateCurveSize(width, plotHeight); m_originalDataCurveItem->updateStepDepth(m_imageLayout.nRulerInterval); m_originalDataCurveItem->setPlotColor(m_lithologyHierachyPlotColor.oriPlotColor); m_originalDataCurveItem->setPos(startWidth, titleHight); m_originalDataCurveItem->setFont(m_lithologyHierachyFont.tableContextFont); startWidth = startWidth + width; } /**刷新比例尺图**/ { float width = 10; m_measureScaleItem->updateCurveSize(width, plotHeight); m_measureScaleItem->updateStepDepth(m_imageLayout.nRulerInterval); m_measureScaleItem->setFont(m_lithologyHierachyFont.scaleplateFont); m_measureScaleItem->setPos(startWidth - width, titleHight); startWidth = startWidth; } /**刷新预处理数据图**/ if (m_isShowPrePlot) { float width = plotWidth / 2; m_pretreatmentDataCurveItem->updateCurveSize(width, plotHeight); m_pretreatmentDataCurveItem->updateStepDepth(m_imageLayout.nRulerInterval); m_pretreatmentDataCurveItem->setPlotColor(m_lithologyHierachyPlotColor.prePlotColor); m_pretreatmentDataCurveItem->setPos(startWidth, titleHight); m_pretreatmentDataCurveItem->setFont(m_lithologyHierachyFont.tableContextFont); startWidth = startWidth + width; } scene->updateBoundingRect(); scene->onSetBackgroundColor(m_imageLayout.backGroundColor); scene->update(); } void DataPretreatmentPlot::on_updateReset() { this->on_refresh(); } void DataPretreatmentPlot::on_updateFilter() { this->on_refresh(); } void DataPretreatmentPlot::on_updateTitle(QString title) { m_lithologyHierachyTitlePlot->setTitle(title); } void DataPretreatmentPlot::on_updateOriginalPlotData(const QList<DepthValue> &depthValueBuff, const float &minDepth, const float &maxDepth, const float &minValue, const float &maxValue) { m_depthValueBuff = depthValueBuff; m_maxDepth = maxDepth; m_minDepth = minDepth; m_lithologyHierachyTitlePlot->setOriginalDataRange(minValue, maxValue); m_originalDataCurveItem->setDepthCurveData(depthValueBuff, minDepth, maxDepth, minValue, maxValue); m_measureScaleItem->setDepthMeasure(minDepth, maxDepth); this->on_refresh(); } void DataPretreatmentPlot::on_updatePlotData(const QList<DepthValue> &depthValueBuff, const float &minDepth, const float &maxDepth, const float &minValue, const float &maxValue) { m_lithologyHierachyTitlePlot->setPreDataRangeRange(minValue, maxValue); m_pretreatmentDataCurveItem->setDepthCurveData(depthValueBuff, minDepth, maxDepth, minValue, maxValue); m_measureScaleItem->setDepthMeasure(minDepth, maxDepth); this->on_refresh(); } /**离开界面**/ void DataPretreatmentPlot::leave() { m_originalDataCurveItem->leave(); m_pretreatmentDataCurveItem->leave(); } /**进入界面**/ void DataPretreatmentPlot::enter() { m_originalDataCurveItem->enter(); m_pretreatmentDataCurveItem->enter(); } /**绘制边框**/ void DataPretreatmentPlot::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter p(this); QPen pen; pen.setColor(Qt::black); // 划线颜色 p.setPen(pen); // 设置画笔记颜色 p.drawRect(0, 0, width() - 1, height() - 1); // 绘制边框 } /************************************************属性设置区域*************/ DataPretreatmentSetting::DataPretreatmentSetting(QWidget *parent) : QWidget(parent) { m_sgNumber = 5; m_imageParaWidget = createImageParaWidgetUI(); initUI(); } /** * @brief createImageParaWidgetUI * 初始化图像参数 */ QWidget *DataPretreatmentSetting::createImageParaWidgetUI() { CusScrollArea *scrollArea = new CusScrollArea(this); QWidget *widget = new QWidget(this); { m_backGroundColorDialog = new QColorDialog(widget); m_backGroundColorDialog->setOption(QColorDialog::ShowAlphaChannel); /// 可以设置透明度 connect(m_backGroundColorDialog, SIGNAL(colorSelected(QColor)), this, SLOT(on_backGroundColorValue(QColor))); QGroupBox *m_imageSizeBox = new QGroupBox(tr("图像"), widget); m_imageSizeBox->setStyleSheet("QGroupBox{font-weight:bold;border: 3px solid rgba(255, 255, 255, 0);border-radius:10px;margin-top:5ex;}" "QGroupBox::title { subcontrol-origin: margin;subcontrol-position: top left;left:0px; margin-left: 0px;padding:0 1px;}"); { QGridLayout *layout = new QGridLayout(widget); QLabel *hLabel = new QLabel(tr("宽度")); hLabel->setAlignment(Qt::AlignCenter); QLabel *vLabel = new QLabel(tr("高度")); vLabel->setAlignment(Qt::AlignCenter); m_imageWidthEdit = new FlatLineEdit(); m_imageWidthEdit->setPlaceholderText(tr("请输入图片宽度像素值。")); m_imageWidthEdit->setText(QString::number(m_imageLayout.widthPix)); m_imageHightEdit = new FlatLineEdit(); m_imageHightEdit->setPlaceholderText(tr("请输入图片高度像素值。")); m_imageHightEdit->setText(QString::number(m_imageLayout.heightPix)); connect(m_imageWidthEdit, SIGNAL(editingFinished()), this, SLOT(on_updateImagePara())); connect(m_imageHightEdit, SIGNAL(editingFinished()), this, SLOT(on_updateImagePara())); layout->addWidget(hLabel, 0, 0); layout->addWidget(m_imageWidthEdit, 0, 1); layout->addWidget(new QLabel(tr("PX")), 0, 2); layout->addWidget(vLabel, 1, 0); layout->addWidget(m_imageHightEdit, 1, 1); layout->addWidget(new QLabel(tr("PX")), 1, 2); m_imageSizeBox->setLayout(layout); } QGroupBox *m_brorderSizeBox = new QGroupBox(tr("边距"), widget); m_brorderSizeBox->setStyleSheet("QGroupBox{font-weight:bold;border: 3px solid rgba(255, 255, 255, 0);border-radius:10px;margin-top:5ex;}" "QGroupBox::title { subcontrol-origin: margin;subcontrol-position: top left;left:0px; margin-left: 0px;padding:0 1px;}"); { QGridLayout *layout = new QGridLayout(widget); QLabel *lrLabel = new QLabel(tr("左右")); lrLabel->setAlignment(Qt::AlignCenter); QLabel *tbLabel = new QLabel(tr("上下")); tbLabel->setAlignment(Qt::AlignCenter); m_borderLREdit = new MarginLineEdit(); m_borderLREdit->setPlaceholderText(tr("请输入左右边距像素值。")); m_borderTBEdit = new MarginLineEdit(); m_borderTBEdit->setPlaceholderText(tr("请输入上下边距像素值。")); m_borderLREdit->setText(QString::number(m_imageLayout.LRBorderPix)); m_borderTBEdit->setText(QString::number(m_imageLayout.TBBorderPix)); connect(m_borderLREdit, SIGNAL(editingFinished()), this, SLOT(on_updateImagePara())); connect(m_borderTBEdit, SIGNAL(editingFinished()), this, SLOT(on_updateImagePara())); layout->addWidget(lrLabel, 0, 0); layout->addWidget(m_borderLREdit, 0, 1); layout->addWidget(new QLabel(tr("PX")), 0, 2); layout->addWidget(tbLabel, 1, 0); layout->addWidget(m_borderTBEdit, 1, 1); layout->addWidget(new QLabel(tr("PX")), 1, 2); m_brorderSizeBox->setLayout(layout); } QGroupBox *m_fontBox = new QGroupBox(tr("字体"), widget); m_fontBox->setStyleSheet("QGroupBox{font-weight:bold;border: 3px solid rgba(255, 255, 255, 0);border-radius:10px;margin-top:5ex;}" "QGroupBox::title { subcontrol-origin: margin;subcontrol-position: top left;left:0px; margin-left: 0px;padding:0 1px;}"); { QGridLayout *layout = new QGridLayout(widget); QLabel *positionLabel = new QLabel(tr("位置")); positionLabel->setAlignment(Qt::AlignCenter); QLabel *fontStyleLabel = new QLabel(tr("格式")); fontStyleLabel->setAlignment(Qt::AlignCenter); QLabel *fontSizeLabel = new QLabel(tr("大小")); fontSizeLabel->setAlignment(Qt::AlignCenter); m_fontPositionCombox = new FlatComboBox(m_fontBox); m_fontPositionCombox->addItem(tr("标题"), DataPretreatmentFont::title); m_fontPositionCombox->addItem(tr("表头"), DataPretreatmentFont::tableTitle); // m_fontPositionCombox->addItem(tr("内容"),DataPretreatmentFont::tableContext); m_fontPositionCombox->addItem(tr("标尺"), DataPretreatmentFont::scaleplate); m_fontPositionCombox->setCurrentIndex(0); connect(m_fontPositionCombox, SIGNAL(currentIndexChanged(int)), this, SLOT(on_fontPositionChange())); m_fontFormatCombox = new FlatComboBox(m_fontBox); QFontDatabase database; foreach (const QString &family, database.families(QFontDatabase::SimplifiedChinese)) { m_fontFormatCombox->addItem(family); } m_fontFormatCombox->setCurrentText(m_lithologyHierachyFont.titleFont.family()); connect(m_fontFormatCombox, SIGNAL(activated(QString)), this, SLOT(on_updateImagePara())); m_fontSizeCombox = new FlatComboBox(m_fontBox); for (int i = 6; i < 33; i++) { m_fontSizeCombox->addItem(QString::number(i) + tr("PX"), i); } m_fontSizeCombox->setCurrentIndex(m_fontSizeCombox->findData(m_lithologyHierachyFont.titleFont.pixelSize())); connect(m_fontSizeCombox, SIGNAL(activated(QString)), this, SLOT(on_updateImagePara())); m_fontBoldBtn = new QToolButton(m_fontBox); m_fontBoldBtn->setToolTip(tr("加粗")); m_fontBoldBtn->setCheckable(true); m_fontBoldBtn->setChecked(m_lithologyHierachyFont.titleFont.bold()); m_fontBoldBtn->setFixedWidth(19); m_fontBoldBtn->setStyleSheet("QToolButton{background:url(E:/outs/cds/resource/MainWindowExample/resource/img/nobold.png);background-repeat: no-repeat;background-color:transparent;}" "QToolButton:checked{background:url(:/image/resource/img/bold.png);background-repeat: no-repeat;background-color:transparent;}"); connect(m_fontBoldBtn, SIGNAL(clicked(bool)), this, SLOT(on_updateImagePara())); layout->addWidget(positionLabel, 0, 0); layout->addWidget(m_fontPositionCombox, 0, 1); layout->addWidget(new QLabel(tr(" ")), 0, 2); layout->addWidget(fontStyleLabel, 1, 0); layout->addWidget(m_fontFormatCombox, 1, 1); layout->addWidget(new QLabel(tr(" ")), 1, 2); layout->addWidget(fontSizeLabel, 2, 0); layout->addWidget(m_fontSizeCombox, 2, 1); layout->addWidget(m_fontBoldBtn, 2, 2); layout->setColumnStretch(1, 1); m_fontBox->setLayout(layout); } QGroupBox *m_otherBox = new QGroupBox(tr("其他"), widget); m_otherBox->setStyleSheet("QGroupBox{font-weight:bold;border: 3px solid rgba(255, 255, 255, 0);border-radius:10px;margin-top:5ex;}" "QGroupBox::title { subcontrol-origin: margin;subcontrol-position: top left;left:0px; margin-left: 0px;padding:0 1px;}"); { QGridLayout *layout = new QGridLayout(m_otherBox); QLabel *backgroundLabel = new QLabel(tr("背景")); backgroundLabel->setAlignment(Qt::AlignCenter); QLabel *scaleplatebLabel = new QLabel(tr("间隔")); scaleplatebLabel->setAlignment(Qt::AlignCenter); QLabel *imageFormatLabel = new QLabel(tr("格式")); imageFormatLabel->setAlignment(Qt::AlignCenter); QLabel *sgNumberLabel = new QLabel(tr("抽样密度")); sgNumberLabel->setAlignment(Qt::AlignCenter); m_backGroundColorBtn = new FlatPushButton(m_otherBox); int r, g, b, a; m_imageLayout.backGroundColor.getRgb(&r, &g, &b, &a); m_backGroundColorBtn->setStyleSheet(QString("background-color: rgba(%1, %2, %3, %4);" "border-color: rgba(%1, %2, %3, %4);" "border-radius:10px;") .arg(r) .arg(g) .arg(b) .arg(a)); connect(m_backGroundColorBtn, SIGNAL(clicked(bool)), SLOT(on_showBackGroundColorDislaog())); m_backGroundColorBtn->setFixedHeight(m_backGroundColorBtn->height() * 1.1); m_scaleplateCombox = new FlatComboBox(); m_scaleplateCombox->addItem(tr("1米"), 1); m_scaleplateCombox->addItem(tr("3米"), 3); m_scaleplateCombox->addItem(tr("5米"), 5); m_scaleplateCombox->addItem(tr("10米"), 10); m_scaleplateCombox->addItem(tr("15米"), 15); m_scaleplateCombox->addItem(tr("20米"), 20); m_scaleplateCombox->addItem(tr("30米"), 30); m_scaleplateCombox->addItem(tr("40米"), 40); m_scaleplateCombox->setCurrentIndex(m_scaleplateCombox->findData(m_imageLayout.nRulerInterval)); connect(m_scaleplateCombox, SIGNAL(currentTextChanged(QString)), this, SLOT(on_updateImagePara())); m_imageFormatCombox = new FlatComboBox("PNG", this); m_imageFormatCombox->setCurrentText(m_imageLayout.imageFormat); connect(m_imageFormatCombox, SIGNAL(currentTextChanged(QString)), this, SLOT(on_updateImagePara())); m_sgNumberCombox = new FlatComboBox(); m_sgNumberCombox->addItem(tr("5"), 5); m_sgNumberCombox->addItem(tr("7"), 7); m_sgNumberCombox->addItem(tr("9"), 9); m_sgNumberCombox->addItem(tr("11"), 11); m_sgNumberCombox->addItem(tr("13"), 13); m_sgNumberCombox->addItem(tr("15"), 15); m_sgNumberCombox->addItem(tr("31"), 31); m_sgNumberCombox->addItem(tr("61"), 61); m_sgNumberCombox->setCurrentIndex(0); connect(m_sgNumberCombox, SIGNAL(currentTextChanged(QString)), this, SLOT(on_upDataSgNumber())); QLabel *label = new QLabel(tr(" ")); label->setFixedWidth(19); layout->addWidget(backgroundLabel, 0, 0); layout->addWidget(m_backGroundColorBtn, 0, 1); layout->addWidget(label, 0, 2); layout->addWidget(scaleplatebLabel, 1, 0); layout->addWidget(m_scaleplateCombox, 1, 1); layout->addWidget(new QLabel(tr("")), 1, 2); layout->addWidget(imageFormatLabel, 2, 0); layout->addWidget(m_imageFormatCombox, 2, 1); layout->addWidget(sgNumberLabel, 3, 0); layout->addWidget(m_sgNumberCombox, 3, 1); layout->setColumnStretch(1, 1); m_otherBox->setLayout(layout); } QGroupBox *m_operateBox = new QGroupBox(tr("操作"), this); m_operateBox->setStyleSheet("QGroupBox{font-weight:bold;border: 3px solid rgba(255, 255, 255, 0);border-radius:10px;margin-top:5ex;}" "QGroupBox::title {font-weight:bold;subcontrol-origin: margin;subcontrol-position: top left;left:0px; margin-left: 0px;padding:0 1px;}"); { FlatToolButton *m_resetBtn = new FlatToolButton(); m_resetBtn->setText(tr("重置")); connect(m_resetBtn, &QPushButton::clicked, [&]() { emit updateReset(); }); FlatToolButton *m_filterBtn = new FlatToolButton(this); m_filterBtn->setText(tr("过滤")); connect(m_filterBtn, &QPushButton::clicked, [&]() { emit updateFilter(); }); QGridLayout *layout = new QGridLayout(); layout->addWidget(m_resetBtn, 0, 0); layout->addWidget(m_filterBtn, 0, 1); m_operateBox->setLayout(layout); } QVBoxLayout *layout = new QVBoxLayout(widget); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->addWidget(m_imageSizeBox); layout->addWidget(m_brorderSizeBox); layout->addWidget(m_fontBox); layout->addWidget(m_otherBox); layout->addWidget(m_operateBox); layout->addStretch(); widget->setLayout(layout); } scrollArea->setScrollWidget(widget); // 给ScrollArea添加内部部件 scrollArea->setWidgetResizable(true); on_fontPositionChange(); return scrollArea; } void DataPretreatmentSetting::refreshImageLayout() { m_imageWidthEdit->setText(QString::number(m_imageLayout.widthPix)); m_imageHightEdit->setText(QString::number(m_imageLayout.heightPix)); m_borderLREdit->setText(QString::number(m_imageLayout.LRBorderPix)); m_borderTBEdit->setText(QString::number(m_imageLayout.TBBorderPix)); int r, g, b, a; m_imageLayout.backGroundColor.getRgb(&r, &g, &b, &a); m_backGroundColorBtn->setStyleSheet(QString("background-color: rgba(%1, %2, %3, %4);" "border-color: rgba(%1, %2, %3, %4);" "border-radius:10px;") .arg(r) .arg(g) .arg(b) .arg(a)); m_scaleplateCombox->setCurrentIndex(m_scaleplateCombox->findData(m_imageLayout.nRulerInterval)); m_imageFormatCombox->setCurrentText(m_imageLayout.imageFormat); emit updateImagePara(m_imageLayout, m_lithologyHierachyFont); } void DataPretreatmentSetting::refreshLithologyHierachyFont() { m_fontFormatCombox->setCurrentText(m_lithologyHierachyFont.titleFont.family()); m_fontSizeCombox->setCurrentIndex(m_fontSizeCombox->findData(m_lithologyHierachyFont.titleFont.pixelSize())); m_fontBoldBtn->setChecked(m_lithologyHierachyFont.titleFont.bold()); on_fontPositionChange(); emit updateImagePara(m_imageLayout, m_lithologyHierachyFont); } void DataPretreatmentSetting::refreshLithologyHierachyPlotColor() { { int r, g, b, a; m_lithologyHierachyPlotColor.oriPlotColor.getRgb(&r, &g, &b, &a); } { int r, g, b, a; m_lithologyHierachyPlotColor.prePlotColor.getRgb(&r, &g, &b, &a); } updatePlotColor(m_lithologyHierachyPlotColor); } /** * @brief initUI * 初始化界面 */ void DataPretreatmentSetting::initUI() { this->setAttribute(Qt::WA_StyledBackground, true); QHBoxLayout *layout = new QHBoxLayout(this); layout->setSpacing(0); layout->setContentsMargins(0, 5, 0, 5); QTabWidget *tabwidget = new QTabWidget(this); tabwidget->setAttribute(Qt::WA_StyledBackground); // 为了使tab-bar设置成功 tabwidget->setStyleSheet("QWidget{background-color:#ffffff}QTabWidget::pane{\ border:none;\ color:#000000;\ background-color:rgba(230,237,247,255);\ }\ QTabWidget::tab-bar{\ alignment:left;\ border:none;\ background-color:rgba(230,237,247,255);\ }\ QTabBar::tab:disabled {\ width: 0; color: transparent;\ }\ QToolButton:disabled {\ width: 0; color: transparent;border:none;\ }\ QCheckBox:disabled {\ width: 0; color: transparent;border:none;\ }\ QCheckBox::indicator:disabled {\ width: 0;height: 0;\ }\ QTabBar::tab{\ color:#000000;\ border:5px solid rgba(230,237,247, 0);\ background:rgba(230,237,247,255);\ }\ QTabBar::tab:hover{\ border:5px solid rgba(255, 255, 255, 0);\ color:#000000;\ background:rgba(250, 250, 250, 100);\ }\ QTabBar::tab:selected{\ border:5px solid rgba(255, 255, 255, 0);\ color:#000000;\ font-weight: bold;\ background:rgba(255, 255, 255, 255);\ }"); tabwidget->setTabPosition(QTabWidget::North); // 设置标题栏位置 tabwidget->setTabsClosable(false); // 设置页签不可关闭 tabwidget->setMovable(true); // 设置页签可以拖动 tabwidget->insertTab(0, m_imageParaWidget, QIcon(":/image/resource/img/imagePara.png"), tr("属性")); tabwidget->setTabToolTip(0, tr("属性")); tabwidget->setCurrentIndex(0); layout->addWidget(tabwidget); } void DataPretreatmentSetting::on_showColorDislaog() { m_colorDialog->exec(); } void DataPretreatmentSetting::on_showBackGroundColorDislaog() { m_backGroundColorDialog->exec(); } void DataPretreatmentSetting::on_colorValue(QColor color) { Q_UNUSED(color); on_updatePlotColor(); } void DataPretreatmentSetting::on_backGroundColorValue(QColor color) { int r, g, b, a; color.getRgb(&r, &g, &b, &a); m_imageLayout.backGroundColor = color; m_backGroundColorBtn->setStyleSheet(QString("background-color: rgba(%1, %2, %3, %4);" "border-color: rgba(%1, %2, %3, %4);" "border-radius:10px;") .arg(r) .arg(g) .arg(b) .arg(a)); on_updateImagePara(); } void DataPretreatmentSetting::on_fontPositionChange() { DataPretreatmentFont::FontPosition fontPostion = (DataPretreatmentFont::FontPosition)m_fontPositionCombox->currentData().toInt(); switch (fontPostion) { case DataPretreatmentFont::title: { m_fontFormatCombox->setCurrentText(m_lithologyHierachyFont.titleFont.family()); m_fontSizeCombox->setCurrentIndex(m_fontSizeCombox->findData(m_lithologyHierachyFont.titleFont.pixelSize())); m_fontBoldBtn->setChecked(m_lithologyHierachyFont.titleFont.bold()); } break; case DataPretreatmentFont::tableTitle: { m_fontFormatCombox->setCurrentText(m_lithologyHierachyFont.tableTitleFont.family()); m_fontSizeCombox->setCurrentIndex(m_fontSizeCombox->findData(m_lithologyHierachyFont.tableTitleFont.pixelSize())); m_fontBoldBtn->setChecked(m_lithologyHierachyFont.tableTitleFont.bold()); } break; case DataPretreatmentFont::tableContext: { m_fontFormatCombox->setCurrentText(m_lithologyHierachyFont.tableContextFont.family()); m_fontSizeCombox->setCurrentIndex(m_fontSizeCombox->findData(m_lithologyHierachyFont.tableContextFont.pixelSize())); m_fontBoldBtn->setChecked(m_lithologyHierachyFont.tableContextFont.bold()); } break; case DataPretreatmentFont::scaleplate: { m_fontFormatCombox->setCurrentText(m_lithologyHierachyFont.scaleplateFont.family()); m_fontSizeCombox->setCurrentIndex(m_fontSizeCombox->findData(m_lithologyHierachyFont.scaleplateFont.pixelSize())); m_fontBoldBtn->setChecked(m_lithologyHierachyFont.scaleplateFont.bold()); } break; default: break; } } void DataPretreatmentSetting::on_upDataSgNumber() { m_sgNumber = m_sgNumberCombox->currentData().toInt(); } void DataPretreatmentSetting::on_updateImagePara() { m_imageLayout.widthPix = m_imageWidthEdit->text().trimmed().toInt(); m_imageLayout.heightPix = m_imageHightEdit->text().trimmed().toInt(); m_imageLayout.LRBorderPix = m_borderLREdit->text().trimmed().toInt(); m_imageLayout.TBBorderPix = m_borderTBEdit->text().trimmed().toInt(); m_imageLayout.nRulerInterval = m_scaleplateCombox->currentData().toInt(); DataPretreatmentFont::FontPosition fontPostion = (DataPretreatmentFont::FontPosition)m_fontPositionCombox->currentData().toInt(); switch (fontPostion) { case DataPretreatmentFont::title: { m_lithologyHierachyFont.titleFont.setFamily(m_fontFormatCombox->currentText()); m_lithologyHierachyFont.titleFont.setPixelSize(m_fontSizeCombox->currentData().toInt()); m_lithologyHierachyFont.titleFont.setBold(m_fontBoldBtn->isChecked()); } break; case DataPretreatmentFont::tableTitle: { m_lithologyHierachyFont.tableTitleFont.setFamily(m_fontFormatCombox->currentText()); m_lithologyHierachyFont.tableTitleFont.setPixelSize(m_fontSizeCombox->currentData().toInt()); m_lithologyHierachyFont.tableTitleFont.setBold(m_fontBoldBtn->isChecked()); } break; case DataPretreatmentFont::tableContext: { m_lithologyHierachyFont.tableContextFont.setFamily(m_fontFormatCombox->currentText()); m_lithologyHierachyFont.tableContextFont.setPixelSize(m_fontSizeCombox->currentData().toInt()); m_lithologyHierachyFont.tableContextFont.setBold(m_fontBoldBtn->isChecked()); } break; case DataPretreatmentFont::scaleplate: { m_lithologyHierachyFont.scaleplateFont.setFamily(m_fontFormatCombox->currentText()); m_lithologyHierachyFont.scaleplateFont.setPixelSize(m_fontSizeCombox->currentData().toInt()); m_lithologyHierachyFont.scaleplateFont.setBold(m_fontBoldBtn->isChecked()); } break; default: break; } emit updateImagePara(m_imageLayout, m_lithologyHierachyFont); } void DataPretreatmentSetting::on_updatePlotColor() { emit updatePlotColor(m_lithologyHierachyPlotColor); } /**绘制边框**/ void DataPretreatmentSetting::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter p(this); QPen pen; pen.setColor(Qt::black); // 划线颜色 p.setPen(pen); // 设置画笔记颜色 p.drawRect(0, 0, width() - 1, height() - 1); // 绘制边框 } void DataPretreatmentSetting::setImageLayout(const ImageLayout &imageLayout) { m_imageLayout = imageLayout; /**刷新界面**/ refreshImageLayout(); } void DataPretreatmentSetting::setLithologyHierachyFont(const DataPretreatmentFont &lithologyHierachyFont) { m_lithologyHierachyFont = lithologyHierachyFont; /**刷新界面**/ refreshLithologyHierachyFont(); } void DataPretreatmentSetting::setLithologyHierachyPlotColor(const DataPretreatmentPlotColor &lithologyHierachyPlotColor) { m_lithologyHierachyPlotColor = lithologyHierachyPlotColor; /**刷新界面**/ refreshLithologyHierachyPlotColor(); } DataPretreatmentFont::DataPretreatmentFont() { titleFont = QFont(QObject::tr("微软雅黑")); // 标题字体 titleFont.setBold(true); titleFont.setPixelSize(18); tableTitleFont = QFont(QObject::tr("微软雅黑")); // 表头字体 tableTitleFont.setBold(true); tableTitleFont.setPixelSize(15); tableContextFont = QFont(QObject::tr("微软雅黑")); // 内容字体 tableContextFont.setBold(false); tableContextFont.setPixelSize(14); scaleplateFont = QFont(QObject::tr("微软雅黑")); // 标尺字体 scaleplateFont.setBold(false); scaleplateFont.setPixelSize(13); } QJsonObject DataPretreatmentFont::toJson(const DataPretreatmentFont &item) { QJsonObject obj; { QJsonObject titleFontobj; titleFontobj.insert("family", item.titleFont.family()); titleFontobj.insert("pixelSize", item.titleFont.pixelSize()); titleFontobj.insert("bold", item.titleFont.bold()); obj.insert("titleFont", titleFontobj); } { QJsonObject tableTitleFontobj; tableTitleFontobj.insert("family", item.tableTitleFont.family()); tableTitleFontobj.insert("pixelSize", item.tableTitleFont.pixelSize()); tableTitleFontobj.insert("bold", item.tableTitleFont.bold()); obj.insert("tableTitleFont", tableTitleFontobj); } { QJsonObject tableContextFontobj; tableContextFontobj.insert("family", item.tableContextFont.family()); tableContextFontobj.insert("pixelSize", item.tableContextFont.pixelSize()); tableContextFontobj.insert("bold", item.tableContextFont.bold()); obj.insert("tableContextFont", tableContextFontobj); } { QJsonObject scaleplateFontobj; scaleplateFontobj.insert("family", item.scaleplateFont.family()); scaleplateFontobj.insert("pixelSize", item.scaleplateFont.pixelSize()); scaleplateFontobj.insert("bold", item.scaleplateFont.bold()); obj.insert("scaleplateFont", scaleplateFontobj); } return obj; } DataPretreatmentFont DataPretreatmentFont::fromJson(const QJsonObject &obj) { DataPretreatmentFont font; { QJsonObject titleFontobj = obj.value("titleFont").toObject(); font.titleFont.setFamily(titleFontobj.value("family").toString()); font.titleFont.setPixelSize(titleFontobj.value("pixelSize").toDouble()); font.titleFont.setBold(titleFontobj.value("bold").toBool()); } { QJsonObject tableTitleFontobj = obj.value("tableTitleFont").toObject(); font.tableTitleFont.setFamily(tableTitleFontobj.value("family").toString()); font.tableTitleFont.setPixelSize(tableTitleFontobj.value("pixelSize").toDouble()); font.tableTitleFont.setBold(tableTitleFontobj.value("bold").toBool()); } { QJsonObject tableContextFontobj = obj.value("tableContextFont").toObject(); font.tableContextFont.setFamily(tableContextFontobj.value("family").toString()); font.tableContextFont.setPixelSize(tableContextFontobj.value("pixelSize").toDouble()); font.tableContextFont.setBold(tableContextFontobj.value("bold").toBool()); } { QJsonObject scaleplateFontobj = obj.value("scaleplateFont").toObject(); font.scaleplateFont.setFamily(scaleplateFontobj.value("family").toString()); font.scaleplateFont.setPixelSize(scaleplateFontobj.value("pixelSize").toDouble()); font.scaleplateFont.setBold(scaleplateFontobj.value("bold").toBool()); } return font; } QJsonObject DataPretreatmentPlotColor::toJson(const DataPretreatmentPlotColor &item) { QJsonObject obj; { QJsonObject colorobj; colorobj.insert("redF", item.oriPlotColor.redF()); colorobj.insert("greenF", item.oriPlotColor.greenF()); colorobj.insert("blueF", item.oriPlotColor.blueF()); obj.insert("oriPlotColor", colorobj); } { QJsonObject colorobj; colorobj.insert("redF", item.prePlotColor.redF()); colorobj.insert("greenF", item.prePlotColor.greenF()); colorobj.insert("blueF", item.prePlotColor.blueF()); obj.insert("prePlotColor", colorobj); } return obj; } DataPretreatmentPlotColor DataPretreatmentPlotColor::fromJson(const QJsonObject &obj) { DataPretreatmentPlotColor color; { QJsonObject colorobj = obj.value("oriPlotColor").toObject(); color.oriPlotColor.setRedF(colorobj.value("redF").toDouble()); color.oriPlotColor.setGreenF(colorobj.value("greenF").toDouble()); color.oriPlotColor.setBlueF(colorobj.value("blueF").toDouble()); } { QJsonObject colorobj = obj.value("prePlotColor").toObject(); color.prePlotColor.setRedF(colorobj.value("redF").toDouble()); color.prePlotColor.setGreenF(colorobj.value("greenF").toDouble()); color.prePlotColor.setBlueF(colorobj.value("blueF").toDouble()); } return color; }
最新发布
12-05
你提供的这段 C++ 代码是地质钻探系统中的 **数据预处理模块 UI 实现**,基于 Qt 框架构建了一个完整的“数据预处理”功能面板。它集成了绘图、参数设置、滤波控制和图像导出等功能。 --- ## 🧠 一、整体架构概览 该模块由三个主要类构成: | 类名 | 功能 | |------|------| | `DataPretreatmentWidget` | 主控部件:布局 + 数据桥接 | | `DataPretreatmentPlot` | 图形显示区域:使用 `QGraphicsScene` 绘图 | | `DataPretreatmentSetting` | 参数设置区:支持字体、颜色、尺寸等自定义 | 采用典型的 **MVC 架构思想**: - Model: `MetaItem`, `DataMagrSingleton` - View: `DataPretreatmentPlot`, `DepthCurveItem`, `MeasureScaleItem` - Controller: `DataPretreatmentSetting` --- ## ✅ 二、核心类详解 ### ✅ 1. `DataPretreatmentWidget` —— 主容器 #### 构造函数 ```cpp DataPretreatmentWidget::DataPretreatmentWidget(int groupNo, QWidget *parent, DataPretreatmentType pretreatmentType) : QWidget(parent), m_dataPretreatmentType(pretreatmentType), m_groupNo(groupNo) { initUI(); setWindowTitleByType(); // 根据类型设置标题 m_plotWidget->on_updateTitle(m_title); } ``` > 支持五种数据类型的预处理: > - 伽马(Gamma) > - 压力(Pressure) > - 震动(Shake) > - 方位角(DirecteAngle) > - 倾角(SlantAngle) --- ### ✅ 2. `initUI()` —— 界面初始化 ```cpp void DataPretreatmentWidget::initUI() { m_plotWidget = new DataPretreatmentPlot(this); m_settingWidget = new DataPretreatmentSetting(this); connect(m_settingWidget, SIGNAL(updateImagePara(...)), m_plotWidget, SLOT(on_updateImagePara(...))); connect(m_settingWidget, SIGNAL(updatePlotColor(...)), m_plotWidget, SLOT(on_updatePlotColor(...))); connect(m_settingWidget, SIGNAL(updateShowPlot(...)), m_plotWidget, SLOT(on_updateShowPlot(...))); connect(m_settingWidget, SIGNAL(updateFilter()), this, SLOT(on_updateFilter())); connect(m_settingWidget, SIGNAL(updateReset()), this, SLOT(on_updateReset())); QSplitter *splitter = new QSplitter(Qt::Horizontal); splitter->addWidget(m_plotWidget); splitter->addWidget(m_settingWidget); QHBoxLayout *layout = new QHBoxLayout; layout->addWidget(splitter); setLayout(layout); } ``` ✅ 使用 `QSplitter` 分割视图与设置面板,用户可拖动调整比例。 --- ### ✅ 3. 数据绑定与更新 #### 设置原始数据 ```cpp void DataPretreatmentWidget::setOriginalData(...) { QList<DepthValue> depthValueBuff; for (auto item : arrayData) { switch(type) { case GammaPlot: value = item->_gamma; break; case PresurePlot: value = item->_pressure; break; ... } depthValueBuff.append(DepthValue(item->_depth, qAbs(value))); } m_plotWidget->on_updateOriginalPlotData(depthValueBuff, minDepth, maxDepth, minValue, maxValue); } ``` #### 更新滤波后数据 ```cpp void DataPretreatmentWidget::updateData(...) { // 同上,但调用 m_plotWidget->on_updatePlotData(...) } ``` 📌 `DepthValue` 是一个 `QPair<float, float>` 的别名:`(depth, value)`,用于绘制深度-数值曲线。 --- ### ✅ 4. 滤波与重置操作 #### 触发 SG 滤波 ```cpp void DataPretreatmentWidget::on_updateFilter() { if (m_dataPretreatmentType == DirecteAnglePlot || SlantAnglePlot || GammaPlot) return; // 禁止对某些类型过滤 int M = m_settingWidget->getCurSgNumber(); // 获取窗口大小 DataMagrSingleton::GetInstance()->sg_filter(m_groupNo, this, M); } ``` > 调用全局管理器执行 Savitzky-Golay 平滑滤波 #### 重置为原始数据 ```cpp void DataPretreatmentWidget::on_updateReset() { DataMagrSingleton::GetInstance()->resetFilteredData(m_groupNo, this); } ``` --- ### ✅ 5. 序列化 / 反序列化(配置保存) ```cpp void DataPretreatmentWidget::toJson(QJsonObject &obj) { obj.insert("Image", ImageLayout::toJson(m_settingWidget->getImageLayout())); obj.insert("Font", DataPretreatmentFont::toJson(...)); obj.insert("Color", DataPretreatmentPlotColor::toJson(...)); } void DataPretreatmentWidget::fromJson(const QJsonObject &obj) { m_settingWidget->setImageLayout(ImageLayout::fromJson(obj["Image"].toObject())); m_settingWidget->setLithologyHierachyFont(DataPretreatmentFont::fromJson(obj["Font"].toObject())); m_settingWidget->setLithologyHierachyPlotColor(DataPretreatmentPlotColor::fromJson(obj["Color"].toObject())); } ``` ✅ 支持将当前界面的样式配置保存到 JSON,并在下次打开时恢复。 --- ### ✅ 6. 导出图片 ```cpp bool DataPretreatmentWidget::exportImage(QString dir) { bool isSuccess = false; m_plotWidget->on_exportImage(dir, isSuccess); return isSuccess; } ``` 内部通过 `OpenGraphicsScene::exportImage()` 实现高质量图像导出(PNG/JPG等格式)。 --- ## ✅ 三、图形绘制组件分析 ### ✅ 1. `DataPretreatmentPlot` —— 主绘图区 #### 使用技术栈 - `QGraphicsScene` + `QGraphicsView` - 自定义图元:`QGraphicsItem` 子类 - 抗锯齿渲染:`QPainter::Antialiasing` #### 添加的关键图元 | 图元 | 作用 | |------|------| | `DataPretreatmentTitlePlot` | 显示标题与表头信息 | | `MeasureScaleItem` | 深度标尺(左侧) | | `DepthCurveItem` ×2 | 原始曲线 & 滤波后曲线 | --- ### ✅ 2. `DataPretreatmentTitlePlot` —— 表头绘制 ```cpp QRectF DataPretreatmentTitlePlot::boundingRect() const { return QRectF(0, 0, m_widthPix, m_highPix); } void DataPretreatmentTitlePlot::paint(QPainter *painter, ...) { painter->drawRect(...); // 边框 painter->setFont(m_titleFont); painter->drawText(..., m_title); // 中心标题 // 左右两栏:“原始数据” 和 “预处理数据” drawRectAndText(painter, "原始数据曲线", m_startOriginal, m_endOriginal); drawRectAndText(painter, "预处理数据曲线", m_startPreData, m_endPreData); } ``` 📌 支持动态更新范围值(如最小/最大值) --- ### ✅ 3. `on_refresh()` —— 布局重排 ```cpp void DataPretreatmentPlot::on_refresh() { float plotWidth = m_imageLayout.widthPix - LR边距*2; float plotHeight = m_imageLayout.heightPix - TB边距*2 - 标题高度; // 原始数据占一半宽度 m_originalDataCurveItem->updateCurveSize(plotWidth / 2, plotHeight); m_originalDataCurveItem->setPos(LR边距, 标题高度); // 标尺紧贴原始图右侧 m_measureScaleItem->updateCurveSize(10, plotHeight); m_measureScaleItem->setPos(...); // 预处理图占另一半 m_pretreatmentDataCurveItem->updateCurveSize(plotWidth / 2, plotHeight); m_pretreatmentDataCurveItem->setPos(... + width, ...); } ``` ✅ 实现了响应式布局,随参数变化自动调整位置与大小。 --- ## ✅ 四、设置面板 `DataPretreatmentSetting` 这是一个复杂的属性配置面板,包含多个分组框: ### 🔧 功能模块 | 模块 | 内容 | |------|------| | **图像尺寸** | 宽度、高度(像素) | | **边距** | 左右边距、上下边距 | | **字体** | 字体族、字号、加粗(支持四种文本类型) | | **其他** | 背景色、标尺间隔、导出格式、SG滤波密度 | | **操作按钮** | “重置”、“过滤” | --- ### ✅ 字体切换逻辑 ```cpp void DataPretreatmentSetting::on_fontPositionChange() { auto pos = (FontPosition)m_fontPositionCombox->currentData().toInt(); switch(pos) { case title: sync font combo with m_lithologyHierachyFont.titleFont; break; case tableTitle: ... } } ``` 当用户选择不同文本位置时,下方字体设置会联动显示对应样式的当前值。 --- ### ✅ 背景颜色选择 ```cpp connect(m_backGroundColorBtn, SIGNAL(clicked()), this, SLOT(on_showBackGroundColorDislaog())); // 弹出 QColorDialog void DataPretreatmentSetting::on_backGroundColorValue(QColor color) { m_imageLayout.backGroundColor = color; update button style sheet → rgba(r,g,b,a) emit updateImagePara(...); } ``` ✅ 实时预览背景色变化。 --- ### ✅ SG 滤波抽样密度选择 ```cpp m_sgNumberCombox->addItem(tr("5"), 5); m_sgNumberCombox->addItem(tr("7"), 7); ... connect(m_sgNumberCombox, &QComboBox::currentTextChanged, this, &DataPretreatmentSetting::on_upDataSgNumber); void DataPretreatmentSetting::on_upDataSgNumber() { m_sgNumber = m_sgNumberCombox->currentData().toInt(); } ``` > 注意:实际调用 `sg_filter()` 时传的是 `M` 参数(可能是多项式阶数),这里应确认是否误用。 --- ## ✅ 五、辅助结构体序列化 ### ✅ `DataPretreatmentFont` 序列化 ```cpp QJsonObject DataPretreatmentFont::toJson(const DataPretreatmentFont &font) { QJsonObject obj; obj["titleFont"] = { {"family", font.titleFont.family()}, {"pixelSize", font.titleFont.pixelSize()}, {"bold", font.titleFont.bold()} }; // ... 其他字体 return obj; } ``` 反序列化同理。 --- ## ⚠️ 六、存在的问题与改进建议 | 问题 | 建议 | |------|------| | `minDepth` 初始化错误:<br>`float minDepth = 0.0f;` 但后续比较用了 `<` 导致永远不更新 | 改为 `FLT_MAX` 或 `arrayData.first()->_depth` | | 多处重复代码:`setOriginalData` 和 `updateData` 几乎完全相同 | 提取为私有函数 `buildDepthValueList(...)` | | `on_updateFilter()` 中禁止伽马滤波?这不合理 | 应允许所有类型进行 SG 滤波 | | `m_sgNumber` 实际用途不明,`sg_filter` 第三个参数是 `N` 还是 `M`? | 明确命名如 `windowSize` / `polyOrder` | | 缺少空指针检查:`m_plotWidget` 是否为空? | 在构造中确保非空 | | 手动管理内存(new/delete),无智能指针 | 使用 `QScopedPointer` 或 RAII | | `paintEvent` 绘制边框可能被样式表覆盖 | 建议统一用样式表或手动绘图之一 | --- ## ✅ 七、典型使用流程 ```text [用户进入数据预处理页] ↓ 创建 DataPretreatmentWidget(type=Gamma, groupNo=1) ↓ 从 DataMagrSingleton 加载原始数据 → setOriginalData(...) ↓ 加载上次保存的配置 → fromJson(configObj) ↓ 用户修改字体/颜色/边距 → 实时预览 on_updateImagePara ↓ 点击“过滤” → on_updateFilter() → 调用 sg_filter(...) → 数据平滑 ↓ 点击“导出” → exportImage("output.png") → 生成报告图 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值