QDialog 不能在 Windows 上退出,但在 MacOS 上不能退出/
A QDialog can't be exited on Windows, but not on 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();
}
}
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 为什么我不能将 rand() 与数组的大小一起使用?
- 为什么虚函数不能是静态的和全局的?
- 为什么我不能在 while 循环中创建线程?
- QDialog 不能在 Windows 上退出,但在 MacOS 上不能退出/
- 为什么我的线程不能优雅地退出?