QT:如何关闭同一个小部件的多个窗口?

Posted

技术标签:

【中文标题】QT:如何关闭同一个小部件的多个窗口?【英文标题】:QT: How to close multiple windows of the same widget? 【发布时间】:2014-05-10 01:19:42 【问题描述】:

我是 C++/Qt 编程的初学者。 我在 Qt 中创建了一个名为 wexample 的小部件。显示时,有一个按钮事件将打开同一个小部件 wexample 的另一个窗口,依此类推。我的问题是如何关闭该小部件的所有窗口?

我打开我的第一个小部件如下:

wexample *w = 新 wexample; w-> 显示();

在小部件内部,我也有这些事件:

void wexample::on_pushButton1_clicked() wexample *w = 新 wexample; w -> 显示(); 无效 wexample::on_pushButton2_clicked() QWidget::close();

所以当按下按钮 1 时,它将打开一个新窗口,依此类推。当按下按钮 2 时,它将关闭按钮所在的窗口。有没有办法一次关闭该小部件的所有窗口?或者更好的是,有没有办法关闭特定窗口(例如,第三个窗口之后的所有窗口)?

我尝试过使用信号和插槽,但我无法连接它们,因为它们都是同名的。我必须事先声明所有小部件才能使其工作,但我不知道用户需要多少小部件。

如果我的问题不清楚,我很抱歉。我真的是一个初学者,已经搜索了一段时间,但找不到答案。也许整个结构没有意义。请帮忙。谢谢。

【问题讨论】:

【参考方案1】:

您应该将新创建的 wexample 添加到列表中,然后在您想关闭它们时遍历它们:

class wexample : public QDialog

...

private Q_SLOTS:
    void on_pushButton1_clicked() 
        wexample *w = new wexample(this);
        m_wexamples.append(w);
        w->show();
    

    void wexample::on_pushButton2_clicked() 
        foreach (wexample *w, m_wexamples)
            w->close();
    

private:
    QList<wexample*> m_wexamples;
;

这里有几点补充:

请注意,我在上面的 wexample 构造函数中添加了 (this)。这可确保对话框具有正确的父级(因此,如果您自己不手动删除对象,则将被清理)。以前,每次显示对话框时都会泄漏内存

第二个按钮的插槽简单地遍历对话框列表并关闭它们。这并不意味着对话框已被删除(实际上关闭它们后仍在列表中)。如果您希望完全删除它们,则使用 QList 的“take”方法,从列表中删除对话框,然后调用 dialog->close();对话框->deleteLater();就在上面

这是一个有些人为的示例,实际上您可能不会从对话框的实现中打开对话框

【讨论】:

这种方法效果很好,你是对的,从对话框中打开一个对话框是不切实际的。这让我意识到这不是显示多个小部件的最佳方法,因为我将无法在小部件之间使用信号槽,因为信号槽之间的连接是在编译时定义的,并且我正在动态创建小部件。 C++ 不是一门容易学习的语言。谢谢你让我看得更清楚!

以上是关于QT:如何关闭同一个小部件的多个窗口?的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt5 中的多个弹出窗口小部件上接收鼠标 EnterEvent 和 LeaveEvent

如何在 QT Designer 中指定默认文本光标小部件

如何关闭在提升的小部件中单击的按钮上的 qt 小部件 ui?

小部件关闭后 Qt 发出信号

如何在 Qt 中将消息从子窗口小部件发送到父窗口?

如何在 Qt 中的弹出窗口小部件上创建平滑的圆角