Qt 调用close()时,ui不会关闭

Qt 调用close()时,ui不会关闭,qt,signals-slots,qwidget,qmainwindow,Qt,Signals Slots,Qwidget,Qmainwindow,在Qt中,我有两个表单,分别是FirstUI和SecondUI。主界面打开第一个UI。在这里,我检查应用程序所需的数据库是否存在,如果不存在,则创建一个新的数据库。它还检查数据库中是否存储了任何wifi网络详细信息。如果存在上次连接的wifi的详细信息,则应用程序将扫描可用网络,并使用数据库中的详细信息连接到wifi网络 现在,如果数据库中没有wifi详细信息,或者如果数据库中列出的网络不存在,或者如果应用程序无法连接到wifi网络,它将发出WifiNotConnected信号 我已将信号连接到

在Qt中,我有两个表单,分别是FirstUI和SecondUI。主界面打开第一个UI。在这里,我检查应用程序所需的数据库是否存在,如果不存在,则创建一个新的数据库。它还检查数据库中是否存储了任何wifi网络详细信息。如果存在上次连接的wifi的详细信息,则应用程序将扫描可用网络,并使用数据库中的详细信息连接到wifi网络

现在,如果数据库中没有wifi详细信息,或者如果数据库中列出的网络不存在,或者如果应用程序无法连接到wifi网络,它将发出WifiNotConnected信号

我已将信号连接到打开第二个UI的插槽

connect(this,SIGNAL(WifiNotConnected()),this,SLOT(OpenSecondUI()));
.....

void FirstUI::OpenSecondUI()
{
   SecondUI *sec = new SecondUI();
   this->close();
   sec->show();
}
第二个UI将打开,但不会关闭第一个UI

编辑:如果存在wifi详细信息,则我有一个继承QObject并为我执行连接任务的WifiBoot类。由于我希望GIF文件在GUI中播放,并且连接在同一时间发生,因此我实例化了进行wifi连接的WifiBoot类,并将其移动到另一个线程。连接wifi后,我发出连接到插槽的完成信号,以打开第二个UI

connect(worker,SIGNAL(finished()),this,SLOT(FinishedConnection()));

void FirstUI::FinishedConnection()
{
   OpenSecondUI();
}
在这里,它关闭第一个UI并打开第二个UI。但在第一种情况下,情况并非如此。为什么会这样?有没有更好的办法? 感谢您的帮助

首先检查

this->close();
返回true。另一件事可能是使用

QWidget::hide()
还可以将FirstUI设置为SecondUI的父级,这样,如果有多个FirstUI实例,应用程序就不会泄漏内存。如果仍然关闭小部件,请忘记父对象


干杯

构造函数本身调用了OpenSecondUI。因此,OpenSecondUI中的关闭发生在UI启动和运行之前。为了解决这个问题,正如QT论坛中所建议的那样,并通过@andrea.marangoni提示构造函数填充过多,我使用了一个单发计时器,将构造函数中的整个代码移动到一个插槽中,并在一定的延迟后调用该插槽。这确保了在调用插槽OpenSecondUI之前,UI已启动并运行

看看这是否有效:确保第二个ui的模态是非模态的。然后在代码中,颠倒顺序,首先显示第二个ui,然后关闭当前ui。sec->show;此->关闭;也许吧,但我无法抗拒。我建议做一个控制器来完成你的目标。控制器将管理两个UI,以便您可以解耦UI。我认为一个用户界面打开另一个用户界面不是一个好的做法。…@andrea.marangoni谢谢你的回复。您能提供一个示例代码吗?@andrea.marangoni这是一个大约有30多个UI的应用程序。因此,拥有一个控制器类是正确的方法吗?@Giz我想说,您已经接近我将采用的方法。“工人”可以是成员。不要在MainWindow的构造函数中执行所有操作。您不需要在同一个类中发出事件,只需要一个条件。这是基本的编程原理,所以我建议阅读更多关于设计原理的内容。它返回true。这就是为什么我感到惊讶。隐藏也不起作用