【问题标题】:on calling close() the ui does not close在调用 close() 时,用户界面不会关闭
【发布时间】: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


【解决方案1】:

先检查是否

this->close();

返回真。另一件事可能是使用隐藏它

QWidget::hide()

以及将FirstUI 设置为SecondUI 的父级,这样如果您有多个FirstUI 实例,您的应用程序就不会泄漏内存。 (如果您仍然close() 小部件,请忘记父项)

干杯

【讨论】:

  • 返回真。这就是为什么我感到惊讶。 hide() 也不起作用
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2010-09-07
    • 1970-01-01
    • 2014-02-20
    • 2010-10-24
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多