Двухоконная программа Qt с двумя виджетами QOpenGLWidget и QPainter - PullRequest
0 голосов
/ 18 июня 2020

Я пишу программу Qt с двумя windows, каждая из которых содержит QOpenGLWidget. В каждом QOpenGLWidget я пишу текст с помощью QPainter. Программа работает, но при выходе я получаю ошибку сегментации (дамп ядра). Эта проблема не возникает, когда я пишу текст только в первом окне. Есть идеи, что не так? Заранее спасибо.

// 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); }

...