但是这样的话,我的窗口无法打开,所以无法关闭窗口
时间: 2024-04-21 15:22:35 浏览: 21
抱歉,我之前提供的优化方案有误。在 UI 线程中使用无限循环会导致应用程序无法响应用户操作,因此窗口无法打开。
为了解决这个问题,可以使用多线程来执行无限循环的任务,以保持窗口的响应性。可以创建一个单独的线程来执行 `conf` 函数中的循环任务。
以下是修改后的代码示例:
```cpp
#include "mywidget.h"
#include "ui_mywidget.h"
#include <QThread>
void conf(void)
{
for(;;)
{
if(start == 1)
{
qDebug() << "Windows Open 1";
// 延时一段时间,例如100毫秒
QThread::msleep(100);
}
else
{
qDebug() << "Windows Close -999";
break;
}
}
}
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MyWidget)
{
ui->setupUi(this);
// 创建一个新的线程
QThread* thread = new QThread();
// 创建一个任务对象
QObject* taskObject = new QObject();
// 将任务对象移动到新线程中
taskObject->moveToThread(thread);
// 连接线程启动信号到任务函数
connect(thread, &QThread::started, taskObject, conf);
// 连接任务函数完成信号到线程终止函数
connect(taskObject, &QObject::destroyed, thread, &QThread::quit);
// 连接线程终止信号到线程销毁函数
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
// 启动线程
thread->start();
}
void MyWidget::closeEvent(QCloseEvent *event)
{
start = 0;
}
MyWidget::~MyWidget()
{
delete ui;
}
```
在上述示例中,我们创建了一个新的线程,并将 `conf` 函数作为任务函数与线程启动信号连接。这样,`conf` 函数将在新线程中执行,而不会阻塞主 UI 线程,从而保持窗口的响应性。
同时,请注意在析构函数中删除线程对象,以确保线程的正确清理和释放。
希望这个解决方案能够解决您的问题。如果您还有其他问题,请随时提问。