c++ - Qt:父子小部件。关闭单个子部件是否意味着关闭其他子部件?

标签 c++ qt parent-child

我在测试 Qt 应用程序时遇到以下问题,该应用程序包含一个父窗口小部件和两个子窗口小部件,它们是单独的窗口。如果父窗口小部件被隐藏,则关闭单个子窗口小部件意味着关闭第二个子窗口部件以及关闭整个应用程序。

这是 Qt 中父/子小部件的正常行为吗?有没有办法保持第二个子窗口小部件可见并使应用程序运行?

#include <QApplication>
#include <QtWidgets>

class MyWidget : public QWidget {
public:
    MyWidget(const QString& title = "", QWidget *parent = nullptr) :
        QWidget(parent) {
        setWindowTitle(title);
        setWindowFlags(windowFlags() | Qt::Window);
        setVisible(true);        
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget parent("Parent");
    MyWidget *child1 = new MyWidget("Child1", &parent);
    MyWidget *child2 = new MyWidget("Child2", &parent);
    QTimer::singleShot(5000, [&](){parent.hide();});

    return a.exec();
}

简单类 MyWidget 共有三个小部件: 父级为“父级”,有两个子级“child1”和“child2”。 5 秒后,父窗口小部件被 QTimer::singleShot 隐藏。 之后,如果我关闭,例如child1窗口,第二个窗口child2 也自动关闭,应用程序完成。

我希望 child1 和 child2 是独立的,关闭其中一个不应关闭另一个。

最佳答案

通常,Qt 中的子级是独立于其他子级的,就像您希望的那样。然而,当最后一个主窗口关闭时(参见 QApplication::lastWindowClosed),应用程序将整体关闭。可能这就是这里发生的事情。但我不确定为什么。

您可以尝试为您的窗口手动定义 closeEvents。不过你的行为很奇怪,因为我记得读过隐藏父窗口也应该在这里隐藏它的子窗口:( https://www.qtcentre.org/threads/61708-Multiple-windows-hide-parent-when-child-shown-unhide-when-child-closed )。

关于c++ - Qt:父子小部件。关闭单个子部件是否意味着关闭其他子部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55741236/

相关文章:

c++ - 通过const引用传递shared_ptr是线程安全的吗?

c++ - 函数执行一次

c++ - 在多台计算机上同步相同的代码块文件

c++ - Qt:为模板构造一个可变迭代器(映射、列表、集合……)

postgresql - postgres - 对列总和的约束(无触发器)

c++ - 在 std::list 中查找值的范围

c++ - 如何让 QWebEngineView 进入全屏 [Qt 5.8]

c++ - Qml访问 ListView 项

javascript - Vue.js 父 <-> 子更新值,路由 View

javascript - 在子窗口中访问父局部变量