Qt(十三)QChart绘制折线图

2023-12-31 22:59

本文主要是介绍Qt(十三)QChart绘制折线图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • 一、简单绘图
      • 二、绘制折线图
        • 实例
          • 自定义DialogPen类
          • mainwindow类
          • 效果演示

一、简单绘图

Qt Charts基于Qt的Graphics View架构,其核心组件是QChartViewQChart

  • QChartView是显示图标的视图,基类为QGraphicsView
  • QChart的基类是QGraphicsltem

类的继承关系:
在这里插入图片描述
创建项目:.pro文件中添加:QT += charts
代码如下:其他文件未修改,修改代码只在mainwindow.cpp文件中进行。
mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QChartView>
#include <QLineSeries>
#include <QValueAxis>
#include <QtMath>
QT_CHARTS_USE_NAMESPACEMainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("QChart简单绘图");//创建图表框架QChartView* cview = new QChartView(this);QChart* chart = new QChart();chart->setTitle("简单函数曲线");cview->setChart(chart);setCentralWidget(cview);//创建折现序列QLineSeries* seriesS = new QLineSeries;QLineSeries* seriesC = new QLineSeries;seriesS->setName("Sinθ");seriesC->setName("Cosθ");chart->addSeries(seriesS);chart->addSeries(seriesC);//添加数据绘制qreal y0,y1,t=0,intv=0.1;size_t count=100;for (size_t i=0;i<count;i++) {y0 = qSin(t);y1 = qCos(t);seriesS->append(t,y0);seriesC->append(t,y1);t += intv;}//创建坐标轴QValueAxis* axisX = new QValueAxis;axisX->setRange(0,10);chart->setAxisX(axisX,seriesS);chart->setAxisX(axisX,seriesC);QValueAxis* axisY = new QValueAxis;axisY->setRange(-1, 1);chart->setAxisY(axisY,seriesS);chart->setAxisY(axisY,seriesC);}MainWindow::~MainWindow()
{delete ui;
}

在这里插入图片描述

二、绘制折线图

数据序列类继承关系
在这里插入图片描述
坐标类继承关系
在这里插入图片描述

实例

初步UI设计
1
2
3

自定义DialogPen类

新建DialogPen类继承QDialog

#ifndef DIALOGPEN_H
#define DIALOGPEN_H#include <QDialog>
#include <QColorDialog>
#include <QPen>
#include <QPalette>namespace Ui {
class DialogPen;
}class DialogPen : public QDialog
{Q_OBJECTpublic:explicit DialogPen(QWidget *parent = nullptr);~DialogPen();QPen getpen();static QPen getPen(QPen initPen, bool &ok);void setPen(const QPen &pen);private slots:void on_pushButton_clicked();private:QPen m_pen;Ui::DialogPen *ui;
};#endif // DIALOGPEN_H
#include "dialogpen.h"
#include "ui_dialogpen.h"
#include <QString>DialogPen::DialogPen(QWidget *parent) :QDialog(parent),ui(new Ui::DialogPen)
{ui->setupUi(this);ui->comboBox->clear();ui->comboBox->addItem("NoPen",0);ui->comboBox->addItem("SolidLine",1);ui->comboBox->addItem("DashLine",2);ui->comboBox->addItem("DotLine",3);ui->comboBox->addItem("DashDotLine",4);ui->comboBox->addItem("DashDotDotLine",5);ui->comboBox->addItem("CustomDashLine",6);ui->comboBox->setCurrentIndex(0);
}DialogPen::~DialogPen()
{delete ui;
}void DialogPen::on_pushButton_clicked()
{QColor color = m_pen.color();QColorDialog::getColor(color);if(color.isValid()){QString str = QString::asprintf("background-color: rgb(%d,%d,%d)",color.red(),color.green(),color.blue());ui->btnColor->setStyleSheet(str);}}QPen DialogPen::getpen()
{m_pen.setStyle(Qt::PenStyle(ui->comboBox->currentIndex()));m_pen.setWidth(ui->spinBox->value());QColor color = ui->btnColor->palette().color(QPalette::Button);m_pen.setColor(color);return m_pen;
}QPen DialogPen::getPen(QPen initPen, bool &ok)
{DialogPen* dlg = new DialogPen;QPen pen;dlg->setPen(initPen);int ret = dlg->exec();if (ret == QDialog::Accepted){pen = dlg->getpen();ok = true;}else {pen = initPen;ok = false;}delete dlg;return pen;
}void DialogPen::setPen(const QPen &pen)
{m_pen = pen;ui->spinBox->setValue(pen.width());int i = static_cast<int>(pen.style());ui->comboBox->setCurrentIndex(i);ui->btnColor->setAutoFillBackground(true);QColor color = pen.color();QString str = QString::asprintf("background-color: rgb(%d,%d,%d)",color.red(),color.green(),color.blue());ui->btnColor->setStyleSheet(str);
}
mainwindow类

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QChartView>
#include <QtCharts>
#include <QColor>
#include <QLineSeries>
#include <QValueAxis>
#include <QtMath>
#include <QTime>
#include <QChart>
#include <QFontDialog>
#include "dialogpen.h"QT_CHARTS_USE_NAMESPACEQT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_actZoomOut_triggered();void on_actZoomIn_triggered();void on_actReset_triggered();void on_actFlush_triggered();void on_btn_set_clicked();void on_btn_titleFont_clicked();void on_rBtn_Up_clicked();void on_rBtn_Down_clicked();void on_rBtn_Left_clicked();void on_rBtn_Right_clicked();void on_checkBox_legend_clicked(bool checked);void on_checkBox_legendBG_clicked(bool checked);void on_pBtn_Font_clicked();void on_pBtn_legendcolor_clicked();void on_pBtn_setMargin_clicked();void on_comboBox_motion_currentIndexChanged(int index);void on_comboBox_theme_currentIndexChanged(int index);void on_sin_curve_clicked();void on_cos_curve_clicked();void on_pBtn_name_clicked();void on_checkBox_curve_clicked(bool checked);void on_checkBox_data_clicked(bool checked);void on_pBtn_color_clicked();void on_pBtn_pen_clicked();void on_horizontalSlider_valueChanged(int value);void on_checkBox_pointLableVisible_clicked(bool checked);void on_pushButton_13_clicked();void on_pushButton_12_clicked();void on_rBtn_Y_clicked();void on_rBtn_XY_clicked();void on_rBtn_XAxies_clicked();void on_rBtn_YAxies_clicked();void on_Axis_isVisible_clicked(bool checked);void on_Axis_range_clicked();void on_Axis_setTitle_clicked();void on_Axis_titleIsVisible_clicked(bool checked);void on_pBtn_style_clicked();void on_pBtn_Fontcolor_clicked();void on_pBtn_setFont_clicked();void on_chk_scaleIsVisible_clicked(bool checked);void on_chk_gridLineVisible_clicked(bool checked);void on_pBtn_Fontcolor_2_clicked();void on_pBtn_Fontcolor_3_clicked();void on_spinBox_Tickcount_valueChanged(int arg1);void on_spinBox_minorTickcount_valueChanged(int arg1);void on_chk_TickLineIsVisible_clicked(bool checked);void on_pBtn_Fontcolor_5_clicked();void on_pBtn_Fontcolor_4_clicked();void on_pBtn_Fontcolor_7_clicked();void on_pBtn_Fontcolor_6_clicked();void on_chk_MinorTickLineIsVisible_clicked(bool checked);private:Ui::MainWindow *ui;void createChart();QLineSeries* curSeries;QValueAxis* curAxis;void prepareData();void updateFromChart();
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ui_dialogPen.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);createChart();prepareData();updateFromChart();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_actZoomOut_triggered()
{ui->cView->chart()->zoom(0.8);}void MainWindow::on_actZoomIn_triggered()
{ui->cView->chart()->zoom(1.2);
}void MainWindow::on_actReset_triggered()
{ui->cView->chart()->zoomReset();
}void MainWindow::createChart()
{QChart* chart = new QChart();chart->setTitle("simple curve");ui->cView->setChart(chart);ui->cView->setRenderHint(QPainter::Antialiasing);QLineSeries* series0 = new QLineSeries;QLineSeries* series1 = new QLineSeries;series0->setName("sin");series1->setName("cos");curSeries = series0;QPen pen;pen.setStyle(Qt::DotLine);pen.setWidth(2);series0->setPen(pen);pen.setStyle(Qt::SolidLine);pen.setColor(Qt::blue);series1->setPen(pen);chart->addSeries(series0);chart->addSeries(series1);QValueAxis* axisX = new QValueAxis;QValueAxis* axisY = new QValueAxis;curAxis = axisX;axisX->setRange(0,10);axisX->setLabelFormat("%.1f");axisX->setTickCount(11);axisX->setMinorTickCount(4);axisX->setTitleText("time(secs)");axisY->setRange(-1.5,1.5);axisY->setTickCount(3);axisY->setMinorTickCount(4);axisY->setTitleText("value");chart->setAxisX(axisX,series0);chart->setAxisX(axisX,series1);chart->setAxisY(axisY,series0);chart->setAxisY(axisY,series1);}void MainWindow::prepareData()
{QLineSeries* series0 = (QLineSeries*)ui->cView->chart()->series().at(0);QLineSeries* series1 = (QLineSeries*)ui->cView->chart()->series().at(1);int cnt = 100;series0->clear();series1->clear();qsrand(QTime::currentTime().second());qreal t=0, y1, y2, inv=0.1;qreal rd;for (int i=0; i<cnt; i++) {rd = (qrand()%10)-5;y1 = qSin(t) + rd/50;series0->append(t,y1);y2 = qCos(t) + rd/50;series1->append(t,y2);t += inv;}
}void MainWindow::updateFromChart()
{QChart* chart = ui->cView->chart();ui->lineEdit_title->setText(chart->title());QMargins mg = chart->margins();ui->spinBox_Down->setValue(mg.bottom());ui->spinBox_Left->setValue(mg.left());ui->spinBox_Right->setValue(mg.right());ui->spinBox_Up->setValue(mg.top());
}void MainWindow::on_actFlush_triggered()
{prepareData();
}void MainWindow::on_btn_set_clicked()
{QChart *chart = ui->cView->chart();chart->setTitle(ui->lineEdit_title->text());
}void MainWindow::on_btn_titleFont_clicked()
{QFont font = ui->cView->chart()->titleFont();bool ok = false;font = QFontDialog::getFont(&ok,font);if(ok)ui->cView->chart()->setTitleFont(font);
}void MainWindow::on_rBtn_Up_clicked()
{ui->cView->chart()->legend()->setAlignment(Qt::AlignTop);
}void MainWindow::on_rBtn_Down_clicked()
{ui->cView->chart()->legend()->setAlignment(Qt::AlignBottom);
}void MainWindow::on_rBtn_Left_clicked()
{ui->cView->chart()->legend()->setAlignment(Qt::AlignLeft);
}void MainWindow::on_rBtn_Right_clicked()
{ui->cView->chart()->legend()->setAlignment(Qt::AlignRight);
}void MainWindow::on_checkBox_legend_clicked(bool checked)
{ui->cView->chart()->legend()->setVisible(checked);
}void MainWindow::on_checkBox_legendBG_clicked(bool checked)
{ui->cView->chart()->legend()->setBackgroundVisible(checked);
}void MainWindow::on_pBtn_Font_clicked()
{QFont font = ui->cView->chart()->legend()->font();bool ok = false;font = QFontDialog::getFont(&ok,font);if(ok)ui->cView->chart()->legend()->setFont(font);
}void MainWindow::on_pBtn_legendcolor_clicked()
{QColor color = ui->cView->chart()->legend()->labelColor();color = QColorDialog::getColor(color);if(color.isValid())ui->cView->chart()->legend()->setLabelColor(color);
}void MainWindow::on_pBtn_setMargin_clicked()
{QMargins mgs;mgs.setTop(ui->spinBox_Up->value());mgs.setLeft(ui->spinBox_Down->value());mgs.setLeft(ui->spinBox_Left->value());mgs.setRight(ui->spinBox_Right->value());ui->cView->chart()->setMargins(mgs);
}void MainWindow::on_comboBox_motion_currentIndexChanged(int index)
{ui->cView->chart()->setAnimationOptions((QChart::AnimationOption)index);
}void MainWindow::on_comboBox_theme_currentIndexChanged(int index)
{ui->cView->chart()->setTheme((QChart::ChartTheme)index);
}void MainWindow::on_sin_curve_clicked()
{if(ui->sin_curve->isChecked())curSeries = (QLineSeries*)ui->cView->chart()->series().at(0);elsecurSeries = (QLineSeries*)ui->cView->chart()->series().at(1);//获取curSeries的值, 设置(标题名称,序列可见的,点数据可见,透明度滑动条)ui->lineEdit_title->setText(curSeries->name());ui->checkBox_curve->setChecked(curSeries->isVisible());ui->checkBox_data->setChecked(curSeries->pointsVisible());ui->horizontalSlider->setValue(curSeries->opacity()*10);ui->checkBox_pointLableVisible->setChecked(curSeries->pointLabelsVisible());
}void MainWindow::on_cos_curve_clicked()
{on_sin_curve_clicked();
}void MainWindow::on_pBtn_name_clicked()
{curSeries->setName(ui->line_name->text());
}void MainWindow::on_checkBox_curve_clicked(bool checked)
{Q_UNUSED(checked)curSeries->setVisible(ui->checkBox_curve->isChecked());
}void MainWindow::on_checkBox_data_clicked(bool checked)
{Q_UNUSED(checked)curSeries->setPointsVisible(ui->checkBox_data->isChecked());
}void MainWindow::on_pBtn_color_clicked()
{QColor color = curSeries->color();color = QColorDialog::getColor(color);if(color.isValid())curSeries->setColor(color);
}void MainWindow::on_pBtn_pen_clicked()
{bool ok = false;QPen pen = curSeries->pen();pen = DialogPen::getPen(pen, ok);if(ok)curSeries->setPen(pen);
}void MainWindow::on_horizontalSlider_valueChanged(int value)
{curSeries->setOpacity(value/10.0);
}void MainWindow::on_checkBox_pointLableVisible_clicked(bool checked)
{curSeries->setPointLabelsVisible(checked);
}void MainWindow::on_pushButton_13_clicked()
{QColor color = curSeries->pointLabelsColor();color = QColorDialog::getColor(color);if(color.isValid())curSeries->setPointLabelsColor(color);
}void MainWindow::on_pushButton_12_clicked()
{QFont font = curSeries->pointLabelsFont();bool ok = false;font = QFontDialog::getFont(&ok, font);if(ok)curSeries->setPointLabelsFont(font);
}void MainWindow::on_rBtn_Y_clicked()
{if(ui->rBtn_Y->isChecked())curSeries->setPointLabelsFormat("@yPoint");elsecurSeries->setPointLabelsFormat("(@xPoint,@yPoint)");
}void MainWindow::on_rBtn_XY_clicked()
{on_rBtn_Y_clicked();
}void MainWindow::on_rBtn_XAxies_clicked()
{// 设置坐标轴QList<QAbstractAxis*> axes;if(ui->rBtn_XAxies->isChecked())axes = ui->cView->chart()->axes(Qt::Horizontal);elseaxes = ui->cView->chart()->axes(Qt::Vertical);curAxis = (QValueAxis*)axes[0];//获取坐标轴属性,显示到界面上ui->dSBox_minV->setValue(curAxis->min());ui->dSBox_maxV->setValue(curAxis->max());ui->Axis_title->setText(curAxis->titleText());ui->Axis_titleIsVisible->setChecked(curAxis->isTitleVisible());ui->lineEdit_style->setText(curAxis->labelFormat());ui->chk_scaleIsVisible->setChecked(curAxis->labelsVisible());ui->chk_gridLineVisible->setChecked(curAxis->isGridLineVisible());ui->spinBox_Tickcount->setValue(curAxis->tickCount());ui->chk_TickLineIsVisible->setChecked(curAxis->isLineVisible());ui->spinBox_minorTickcount->setValue(curAxis->minorTickCount());ui->chk_MinorTickLineIsVisible->setChecked(curAxis->isMinorGridLineVisible());}void MainWindow::on_rBtn_YAxies_clicked()
{on_rBtn_XAxies_clicked();
}void MainWindow::on_Axis_isVisible_clicked(bool checked)
{curAxis->setVisible(checked);
}void MainWindow::on_Axis_range_clicked()
{curAxis->setRange(ui->dSBox_minV->value(), ui->dSBox_maxV->value());
}void MainWindow::on_Axis_setTitle_clicked()
{curAxis->setTitleText(ui->Axis_title->text());
}void MainWindow::on_Axis_titleIsVisible_clicked(bool checked)
{curAxis->setTitleVisible(checked);
}void MainWindow::on_pBtn_style_clicked()
{curAxis->setLabelFormat(ui->lineEdit_style->text());
}void MainWindow::on_pBtn_Fontcolor_clicked()
{QColor color = curAxis->labelsColor();color = QColorDialog::getColor(color);if(color.isValid())curAxis->setLabelsColor(color);
}void MainWindow::on_pBtn_setFont_clicked()
{QFont font = curAxis->labelsFont();bool ok = false;font = QFontDialog::getFont(&ok, font);if(ok)curAxis->setLabelsFont(font);
}void MainWindow::on_chk_scaleIsVisible_clicked(bool checked)
{curAxis->setLineVisible(checked);
}void MainWindow::on_chk_gridLineVisible_clicked(bool checked)
{curAxis->setGridLineVisible(checked);
}void MainWindow::on_pBtn_Fontcolor_2_clicked()
{QColor color = curAxis->gridLineColor();color = QColorDialog::getColor(color);if(color.isValid())curAxis->setGridLineColor(color);
}void MainWindow::on_pBtn_Fontcolor_3_clicked()
{bool ok = false;QPen pen = curAxis->gridLinePen();pen = DialogPen::getPen(pen, ok);if(ok)curAxis->setGridLinePen(pen);
}void MainWindow::on_spinBox_Tickcount_valueChanged(int arg1)
{curAxis->setTickCount(arg1);
}void MainWindow::on_spinBox_minorTickcount_valueChanged(int arg1)
{curAxis->setMinorTickCount(arg1);
}void MainWindow::on_chk_TickLineIsVisible_clicked(bool checked)
{curAxis->setLineVisible(checked);
}void MainWindow::on_pBtn_Fontcolor_5_clicked()
{bool ok = false;QPen pen = curAxis->linePen();pen = DialogPen::getPen(pen, ok);if(ok)curAxis->setLinePen(pen);
}void MainWindow::on_pBtn_Fontcolor_4_clicked()
{QColor color = curAxis->linePenColor();color = QColorDialog::getColor(color);if(color.isValid())curAxis->setLinePenColor(color);
}void MainWindow::on_pBtn_Fontcolor_7_clicked()
{QColor color = curAxis->minorGridLineColor();color = QColorDialog::getColor(color);if(color.isValid())curAxis->setMinorGridLineColor(color);
}void MainWindow::on_pBtn_Fontcolor_6_clicked()
{bool ok = false;QPen pen = curAxis->gridLinePen();pen = DialogPen::getPen(pen, ok);if(ok)curAxis->setGridLinePen(pen);
}void MainWindow::on_chk_MinorTickLineIsVisible_clicked(bool checked)
{curAxis->setMinorGridLineVisible(checked);
}
效果演示

在这里插入图片描述

这篇关于Qt(十三)QChart绘制折线图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/557383

相关文章

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

【QT】基础入门学习

文章目录 浅析Qt应用程序的主函数使用qDebug()函数常用快捷键Qt 编码风格信号槽连接模型实现方案 信号和槽的工作机制Qt对象树机制 浅析Qt应用程序的主函数 #include "mywindow.h"#include <QApplication>// 程序的入口int main(int argc, char *argv[]){// argc是命令行参数个数,argv是

Python QT实现A-star寻路算法

目录 1、界面使用方法 2、注意事项 3、补充说明 用Qt5搭建一个图形化测试寻路算法的测试环境。 1、界面使用方法 设定起点: 鼠标左键双击,设定红色的起点。左键双击设定起点,用红色标记。 设定终点: 鼠标右键双击,设定蓝色的终点。右键双击设定终点,用蓝色标记。 设置障碍点: 鼠标左键或者右键按着不放,拖动可以设置黑色的障碍点。按住左键或右键并拖动,设置一系列黑色障碍点

使用Qt编程QtNetwork无法使用

使用 VS 构建 Qt 项目时 QtNetwork 无法使用的问题 - 摘叶飞镖 - 博客园 (cnblogs.com) 另外,强烈建议在使用QNetworkAccessManager之前看看这篇文章: Qt 之 QNetworkAccessManager踏坑记录-CSDN博客 C++ Qt开发:QNetworkAccessManager网络接口组件 阅读目录 1.1 通用API函数

JavaSE(十三)——函数式编程(Lambda表达式、方法引用、Stream流)

函数式编程 函数式编程 是 Java 8 引入的一个重要特性,它允许开发者以函数作为一等公民(first-class citizens)的方式编程,即函数可以作为参数传递给其他函数,也可以作为返回值。 这极大地提高了代码的可读性、可维护性和复用性。函数式编程的核心概念包括高阶函数、Lambda 表达式、函数式接口、流(Streams)和 Optional 类等。 函数式编程的核心是Lambda

Qt多语种开发教程

Qt作为跨平台的开发工具,早已应用到各行各业的软件开发中。 今天讲讲,Qt开发的正序怎么做多语言开发。就是说,你设置中文,就中文显示;设置英语就英文显示,设置繁体就繁体显示,设置发育就显示法语等。 开发环境(其实多语种这块根环境没太大关系):win10,Qt.5.12.10 一.先用QtCreator创建一个简单的桌面程序 1.工程就随便命名“LanguageTest”,其他默认。 2.在设计师

Qt中window frame的影响

window frame 在创建图形化界面的时候,会创建窗口主体,上面会多出一条,周围多次一圈细边,这就叫window frame窗口框架,这是操作系统自带的。 这个对geometry的一些属性有一定影响,主要体现在Qt坐标系体系: 窗口当中包含一个按钮,这个按钮的坐标系是以父元素为参考,那么这个参考是widget本体作为参考,还是window frame作为参考,这两种参考体系都存在