QDialog 不能在 Windows 上退出,但在 MacOS 上不能退出/



我在Qt5(C++(中有一个对话框。您可以看到对话框只是创建一些小部件(VisGLWidget来自QOpenGLWidget(并不断更新它。

#include "visualizationdlg.h"
#include "ui_visualizationdlg.h"
VisualizationDlg::VisualizationDlg(QWidget *parent, NewtonSpace *data) :
QDialog(parent),
ui(new Ui::VisualizationDlg)
{
ui->setupUi(this);
this->setFixedSize(600,600);
this->data = data;
this->visualizationGL = new VisGLWidget(this, this->data);
this->visualizationGL->setObjectName(QString::fromUtf8("visualizationGL"));
this->visualizationGL->setGeometry(QRect(10, 50, 581, 541));
this->visualizationGL->repaint();
this->rePaintTimer = startTimer(1);
}
VisualizationDlg::~VisualizationDlg()
{
delete ui;
}
void VisualizationDlg::timerEvent(QTimerEvent *event)
{
if(event->timerId() == this->rePaintTimer) {
this->data->update(ui->GInput->value(), ui->updateSpdInput->value());
this->visualizationGL->repaint();
this->rePaintTimer = startTimer(1);
}
}

问题是,我可以通过在MacOS上单击十字来退出此对话框,但不能在Windows上退出。怎么了?

在你的VisualizationDlg构造函数中,你有...

this->rePaintTimer = startTimer(1);

这将导致每毫秒(可能(向VisualizationDlg实例发送一次QTimerEvent

现在考虑处理计时器事件的代码...

void VisualizationDlg::timerEvent (QTimerEvent *event)
{
if(event->timerId() == this->rePaintTimer) {
this->data->update(ui->GInput->value(), ui->updateSpdInput->value());
this->visualizationGL->repaint();
this->rePaintTimer = startTimer(1);
}
}

首次调用此函数时,与计时器事件关联的 id 将与rePaintTimer匹配。 因此,将调用repaint。 但是,您随后启动一个新的计时器并将其 id 分配给rePaintTimer,而不停止原始计时器。 您现在有两个计时器,每个计时器以 1KHz 生成事件,但您的事件处理程序仅作用于最近创建的计时器中的事件。

现在想想几秒钟后会变成什么样子。 您可能有数千个计时器,每个计时器以 1KHz 生成事件。

删除该行...

this->rePaintTimer = startTimer(1);

从您的事件处理程序中制作它...

void VisualizationDlg::timerEvent (QTimerEvent *event)
{
if(event->timerId() == this->rePaintTimer) {
this->data->update(ui->GInput->value(), ui->updateSpdInput->value());
this->visualizationGL->repaint();
}
}

最新更新