我正在编写一个带有两个窗口的 Qt 程序,每个窗口都包含一个 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); }