现有一个这样的ui设计
可以看出在centralWidget
下我又新设置了一个mapWidget
,想要只在这个里面显示一个chart。
显示chart的操作如下:
// Qt charts
QtCharts::QLineSeries *series = new QtCharts::QLineSeries();
series->append(0, 6);
series->append(2, 4);
series->append(3, 8);
series->append(7, 4);
series->append(10, 5);
*series << QPointF(11, 1) << QPointF(13, 3) << QPointF(17, 6) << QPointF(18, 3) << QPointF(20, 2);
QtCharts::QChart *chart = new QtCharts::QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chart->setTitle("Simple line chart example");
QtCharts::QChartView *chartView = new QtCharts::QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
默认的代码是,
MainWindow w;
w.setCentralWidget(chartView);
但这样就不是显示在我想要的这块区域里了,请问该怎么解决,谢谢!
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtCharts>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Get the existing widget from the UI
QWidget *existing_widget = ui->chart_widget;
// Create the chart
QChart *chart = new QChart();
QLineSeries *series = new QLineSeries();
series->append(0, 6);
series->append(2, 4);
series->append(3, 8);
series->append(7, 4);
chart->addSeries(series);
chart->createDefaultAxes();
// Create the chart view
QChartView *chart_view = new QChartView(chart, existing_widget);
// Set the layout
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(chart_view);
existing_widget->setLayout(layout);
}
MainWindow::~MainWindow()
{
delete ui;
}
// 需要的头文件
#include <QtCharts/QChartView>
#include <QSplineSeries>
// #include <QLineSeries> (请看下文注释,如果你想用QLineSeries请去掉注释)
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// ui->chart是设计器创建的,名字是我起的,请读者根据自己的情况修改
// setRenderHint(Antialiasing);是设置抗锯齿渲染的意思
ui->chart->setRenderHint(QPainter::RenderHint::Antialiasing);
// 创建一个QChart对象
auto chart = new QtCharts::QChart();
// 创建线性数据列(QSplineSeries表示这是一条曲线)
// 如果你想要折线,可以写QLineSeries
auto lineSeries = new QtCharts::QSplineSeries(this);
// 添加数据点,这里采用C++的流风格(<<),你也可以用append。
// append也有几个重载,尝试输入一下,QtCreator会告诉你
*lineSeries << QPointF(0, 20) << QPointF(1, 12) << QPointF(2, 10) << QPointF(3, 13);
// 同理,这里再添加一条数据列,跟上边一样
// QLineSeries表示这条线是折现
auto lineSeries2 = new QtCharts::QLineSeries(this);
*lineSeries2 << QPointF(0, 25) << QPointF(1, 19) << QPointF(2, 3) << QPointF(3, 15);
// 给图表对象添加数据列
chart->addSeries(lineSeries);
chart->addSeries(lineSeries2);
// 让图标根据数据列自动创建坐标轴
chart->createDefaultAxes();
// 将图标装进QChartView
ui->chart->setChart(chart);
}
效果如下:
蓝色对应数据列lineSeries
(曲线),绿色对应数据列lineSeries2
(折线)
回答:
首先,在UI界面中放置一个Widget,可以参考参考资料中的段落0。
然后需要在这个Widget中显示一个chart图表,需要进行以下步骤:
链接chart模块,如参考资料中的段落3,需要在项目.pro文件中添加“QT += charts”。
在Widget的头文件中引入chart模块的头文件:
#include <QtCharts>
using namespace QtCharts;
QChart *chart = new QChart;
QBarSeries *series = new QBarSeries;
series->append(new QBarSet("Data1", 1));
series->append(new QBarSet("Data2", 2));
series->append(new QBarSet("Data3", 3));
chart->addSeries(series);
QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
ui->widget->layout()->addWidget(chartView);
其中,ui->widget指的是在UI界面中你添加的那个Widget。
注意:在添加chart之前,需要添加一行代码来设置属性,以确保样式表生效。
this->setAttribute(Qt::WA_StyledBackground, true);
至此,就可以在指定的Widget中显示chart了。