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