在Qt中,我有两种形式,即FirstUI和SecondUI。main打开FirstUI。在这里,我检查应用程序所需的数据库是否存在,如果不存在,则创建一个新的数据库。它还检查数据库中是否存储了任何wifi网络的详细信息。如果有最后一次连接的wifi的详细信息,那么应用程序会扫描可用网络,并使用数据库中的详细信息连接到wifi网络。
现在,如果数据库中没有wifi详细信息,或者数据库中列出的网络不存在,或者应用程序无法连接到wifi网络,它将发出信号WifiNotConnected();
我已将信号连接到打开SecondUI的插槽。
connect(this,SIGNAL(WifiNotConnected()),this,SLOT(OpenSecondUI()));
.....
void FirstUI::OpenSecondUI()
{
SecondUI *sec = new SecondUI();
this->close();
sec->show();
}
SecondUI会打开,但不会关闭FirstUI。
编辑:如果存在wifi详细信息,我有一个类(WifiBoot),它继承了QObject并为我执行连接任务。由于我希望GIF文件在GUI中播放,并且连接发生在我实例化了执行wifi连接的类(WifiBoot)并将其移到另一个线程的同时。连接wifi后,我发出完成的信号,该信号连接到插槽以打开SecondUI
connect(worker,SIGNAL(finished()),this,SLOT(FinishedConnection()));
void FirstUI::FinishedConnection()
{
OpenSecondUI();
}
在这里,它关闭FirstUI并打开SecondUI。但在第一种情况下,情况并非如此。为什么会发生这种情况?有更好的方法吗?感谢提供的任何帮助
首先检查
this->close();
返回true。另一件事可能是使用隐藏它
QWidget::hide()
以及将FirstUI
设置为SecondUI
的父级,这样如果您有多个FirstUI
实例,您的应用程序就不会泄漏内存。(如果您仍然close()
小部件,请忘记父对象)
欢呼
OpenSecondUI()是在构造函数本身中调用的。因此,OpenSecondUI()中的close()是在UI启动并运行之前发生的。为了按照QT论坛中的建议解决这个问题,并通过@andrea.marangoni提示构造函数填充过多,我使用了一个单次计时器,将构造函数中的整个代码移动到一个插槽中,并在一定延迟后调用该插槽。这确保了在调用插槽OpenSecondUI()之前,UI已经启动并运行。