【发布时间】:2014-02-26 10:39:03
【问题描述】:
在 Qt 中,我有两种形式,分别是 FirstUI 和 SecondUI。主要打开 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 详细信息,我有一个继承 QObject 并为我执行连接任务的类 (WifiBoot)。由于我希望在 GUI 中播放 GIF 文件并同时发生连接,因此我已经实例化了进行 wifi 连接的类 (WifiBoot) 并将其移动到另一个线程。连接 wifi 后,我发出完成的信号,该信号连接到插槽以打开 SecondUI
connect(worker,SIGNAL(finished()),this,SLOT(FinishedConnection()));
void FirstUI::FinishedConnection()
{
OpenSecondUI();
}
在这里它关闭了 FirstUI 并打开了 SecondUI。但在第一种情况下,它没有。为什么会这样?有没有更好的方法来解决它? 任何帮助表示赞赏
【问题讨论】:
-
看看这是否有效:确保第二个 ui 的模态是
NonModal。然后在您的代码中颠倒顺序,首先显示第二个 ui,然后关闭当前的。 (sec->show(); this->close();) -
可能是 OT 但我无法抗拒。我建议制作一个控制器来实现您的目标。控制器将管理两个 UI,因此您可以解耦 UI。我不认为一个 UI 打开另一个 UI 是一个好习惯..
-
@andrea.marangoni 感谢您的回复。能否提供示例代码?
-
@andrea.marangoni 这是一个拥有大约 30 多个 UI 的应用程序。那么拥有一个控制器类是正确的方法吗?
-
@Giz 我会说你接近我将采取的方法。 “工人”可能是成员。不要在
MainWindow的构造函数中做所有事情。你不需要在同一个类中发出事件,你只需要一个条件。这是基本的编程原则,所以我建议阅读更多关于设计原则的内容..
标签: qt signals-slots qwidget qmainwindow