2014-02-26 199 views
0

在Qt中,我有一个2表单FirstUI和SecondUI。主要打开FirstUI。在这里我检查应用程序需要的数据库是否存在,如果不存在,则创建一个新的数据库。它还检查数据库中是否存在任何无线网络详细信息。如果有最后连接的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成品信号。但在第一种情况下并不是。这是为什么发生?有没有更好的方法去解决它? 任何帮助表示赞赏

+0

看看是否有效:确保第二个用户界面的模式是“NonModal”。然后在您的代码中反转该顺序,首先显示第二个UI,然后关闭当前的一个。 ('sec-> show(); this-> close();') – Mousa

+1

可能是OT,但我无法抗拒。我会建议做一个控制器来完成你的目标。控制器将管理两个用户界面,以便分离用户界面。我不认为这是一个良好的做法,用户界面打开另一个用户界面。 –

+0

@ andrea.marangoni感谢您的回复。你能否提供一个示例代码? – Giz

回答

0

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

0

首先检查是否

this->close(); 

返回true。其他的事情可能只是隐藏它使用

QWidget::hide() 

以及设置FirstUISecondUI的父母,所以如果你有FirstUI多个实例您的应用程序不会出现内存泄漏。 (忘了父母的事情,如果你仍然close()小部件)

欢呼

+0

它返回true。这就是我感到惊讶的原因。 hide()也不起作用 – Giz