下面是完整的攻略:
问题背景
在Qt中,如果我们需要显示一个图表,可以使用Qt Charts模块来实现。而Qt Charts模块中,常用的绘图控件是QChartView。但是,如果我们希望在QGraphicsView中显示图表,就需要将QGraphicsView提升为QChartView,这时候可能会遇到一个报错:
QOpenGLWidget: Failed to create context
QOpenGLWidget: Failed to create context
QOpenGLWidget: Failed to create context
这个报错的原因是Qt Charts模块使用了OpenGL来绘制图表,而QGraphicsView默认使用了QWidget作为视口,因此会出现OpenGL上下文创建失败的问题。那么,该如何才能在QGraphicsView中显示图表呢?
解决方案
我们可以自定义一个QGraphicsScene,并将QGraphicsView的视口设置为该场景,然后在场景中添加一个QChartView控件,使其显示图表。具体步骤如下:
1. 自定义QGraphicsScene
class ChartScene : public QGraphicsScene {
public:
ChartScene(QObject *parent = nullptr) : QGraphicsScene(parent) {}
~ChartScene() override {}
void setChart(QChart *chart) {
m_chart = chart;
setSceneRect(m_chart->geometry());
}
protected:
void drawBackground(QPainter *painter, const QRectF &rect) override {
if (m_chart != nullptr) {
m_chart->resize((int)rect.width(), (int)rect.height());
QPixmap pixmap((int)rect.width(), (int)rect.height());
m_chart->repaint(pixmap);
painter->drawPixmap((int)rect.x(), (int)rect.y(), pixmap);
}
}
private:
QChart *m_chart = nullptr;
};
这里我们自定义了一个ChartScene,继承自QGraphicsScene。在这个类中,我们重写了drawBackground()函数,在其中使用QPainter绘制出我们的图表。
2. 在QGraphicsView中使用QChartView
QChart *chart = new QChart();
// 创建图表
// ...
ChartScene *scene = new ChartScene();
scene->setChart(chart);
QGraphicsView *view = new QGraphicsView(scene);
// 将QGraphicsView的视口设置为我们自定义的场景
// ...
在这里,我们创建了一个QChart控件,然后创建一个ChartScene对象,并将其场景设为该图表。最后,我们创建了一个QGraphicsView对象,将其视口设为该场景。
3. 显示图表
view->show();
最后,我们调用show()函数来显示出QGraphicsView控件。
示例
示例1:显示简单的折线图
QLineSeries *series = new QLineSeries();
series->append(0, 6);
series->append(2, 4);
series->append(3, 8);
series->append(7, 4);
series->append(10, 5);
QChart *chart = new QChart();
chart->legend()->hide();
chart->addSeries(series);
chart->createDefaultAxes();
chart->setTitle("Simple line chart");
ChartScene *scene = new ChartScene();
scene->setChart(chart);
QGraphicsView *view = new QGraphicsView(scene);
view->show();
这个示例中,我们创建了一个简单的折线图,并将其显示在QGraphicsView中。我们可以看到,图表已经正确地显示出来。
示例2:显示多个条形图
QBarSet *set0 = new QBarSet("Bar1");
QBarSet *set1 = new QBarSet("Bar2");
QBarSet *set2 = new QBarSet("Bar3");
*set0 << 4 << 7 << 5 << 2 << 1;
*set1 << 3 << 5 << 8 << 13 << 8;
*set2 << 6 << 4 << 4 << 7 << 2;
QBarSeries *series = new QBarSeries();
series->append(set0);
series->append(set1);
series->append(set2);
QChart *chart = new QChart();
chart->addSeries(series);
chart->setTitle("Multiple bar charts");
ChartScene *scene = new ChartScene();
scene->setChart(chart);
QGraphicsView *view = new QGraphicsView(scene);
view->show();
这个示例中,我们创建了三个条形图,并将它们合并为一个QBarSeries控件,并将其显示在QGraphicsView中。同样地,图表已经正确地显示出来。
以上就是完整的攻略,如果按照以上步骤操作,应该就可以完美解决QGraphicsView提升到QChartView报错的问题了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:完美解决QT QGraphicsView提升到QChartView报错的问题 - Python技术站