0

I am writing a Qt program with two windows, each containing a QOpenGLWidget. In each QOpenGLWidget I write text with QPainter. The program works, but when it exits I get a Segmentation fault (core dumped). This problem does not occur when I only write text in the first window. Any idea what is wrong? Thanks in advance.

// openglwindow.h
class OpenGLWidget1 : public QOpenGLWidget
{  Q_OBJECT

public:
   explicit OpenGLWidget1(QWidget *parent = nullptr);
   void paintGL();

signals:

public slots:
};

class OpenGLWidget2 : public QOpenGLWidget
{  Q_OBJECT

public:
   explicit OpenGLWidget2(QWidget *parent = nullptr);
   void paintGL();

signals:

public slots:
};

// -----------------

// openglwindow.cpp
#include "openglwindow.h"

OpenGLWidget1::OpenGLWidget1(QWidget *parent) : QOpenGLWidget(parent)
{  }

void OpenGLWidget1::paintGL()
{  QPainter painter(this);
   QColor fontColor=QColor(255,0,0,255);
   painter.setPen(fontColor);
   QString yo=QString::number(2020);
   painter.drawText(50,50,yo);
}

OpenGLWidget2::OpenGLWidget2(QWidget *parent) : QOpenGLWidget(parent)
{  }

void OpenGLWidget2::paintGL()
{  QPainter painter(this);
   QColor fontColor=QColor(255,0,0,255);
   painter.setPen(fontColor);
   QString yo=QString::number(2021);
   // this line causes segmentation fault at the exit
   painter.drawText(50,50,yo);
}

// -----------------

// mainwindow.h
#include <QMainWindow>
#include "openglwindow.h"
#include "pixwindow.h"

namespace Ui { class MainWindow; }

class MainWindow : public QMainWindow
{  Q_OBJECT

public:
   explicit MainWindow(QWidget *parent = 0);
   ~MainWindow();
   OpenGLWidget1 *w1;
   OpenGLWidget2 *f1;
   PixWindow *fo;

private slots:
   void on_actionQuit_triggered();

private:
    Ui::MainWindow *ui;
};

// -----------------

// mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{  ui->setupUi(this);
   // main window
   w1=ui->ogl1;
   // pixel window
   fo=new PixWindow(); 
   fo->setWindowTitle("Pixel Window");
   fo->show();
}

MainWindow::~MainWindow()
{  delete ui; }

void MainWindow::on_actionQuit_triggered()
{  qApp->quit(); }

// -----------------

// pixwindow.h
#include <QDialog>
#include <openglwindow.h>

namespace Ui { class PixWindow; }

class PixWindow : public QDialog
{  Q_OBJECT

public:
   explicit PixWindow(QWidget *parent = 0);
   ~PixWindow();
   OpenGLWidget2 *return_window();

private:
   Ui::PixWindow *ui;
};

// -----------------

// pixwindow.cpp
PixWindow::PixWindow(QWidget *parent) : QDialog(parent), ui(new Ui::PixWindow)
{  ui->setupUi(this);
}

PixWindow::~PixWindow()
{  delete ui; }

OpenGLWidget2 *PixWindow::return_window()
{ return(ui->ogl2); }

  • have you tried running with address sanitizer ? – Cristi Jun 18 '20 at 11:08
  • Thank you, I have now try address sanitizer and I get SEGV on unknown address 0x000000000008 caused by a READ memory access, address points to the zero page. QObject::thread(), QOpenGLVertexArrayObject::destroy(), QOpenGLTextureGlyphCache::~QOpenGLTextureGlyphCache(), QFontEngine::~QFontEngine(), ... QCoreApplication::~QCoreApplication(), main.cpp:5 – Francisco Francisco Jun 18 '20 at 13:36

0 Answers0