【问题标题】:Qt: parent-child widgets. Does closing of a single child widget imply closing of other children?Qt:父子小部件。关闭单个子部件是否意味着关闭其他子部件?
【发布时间】:2019-09-08 12:11:51
【问题描述】:

我的测试 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 是独立的,关闭其中一个不应关闭另一个。

【问题讨论】:

    标签: c++ qt parent-child


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!代码 hide();事件->忽略();在重新定义的 closeEvent(QCloseEvent *event) 中确实可以防止隐藏其他子窗口。
    猜你喜欢
    • 2020-05-22
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多