【问题标题】:Qt: how can one close a window upon another window closed by the userQt:如何在用户关闭另一个窗口时关闭一个窗口
【发布时间】:2022-01-07 17:03:53
【问题描述】:

以下代码 sn -p 打开两个窗口,w1 和 w2。当 w1 被用户关闭时,如何强制 w2 关闭?正如评论中所说,connect 函数不是这样工作的。

#include <QApplication>
#include <QtGui>
#include <QtCore>
#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w1;
    w1.setWindowTitle("w1");
    w1.show();

    QWidget w2;
    w2.setWindowTitle("w2");
    w2.show();

    // when w1 is closed by the user, I would like w2 to close, too.
    // However, it won't happen, even though the code compiles fine.
    QObject::connect(&w1, &QObject::destroyed, &w2, &QWidget::close);

    return a.exec();
}

编辑就我而言,这两个小部件设计在两个独立的库中,因此它们无法相互通信。因此,关闭事件不适用。

编辑最终我对我的问题的解决方案是基于@JeremyFriesner 的回答:在closeEventw1 中发出closed 信号,然后连接它(而不是QObject::destroyed ) 到w2

【问题讨论】:

  • 我认为Destroyed 信号仅在对象超出范围并释放其内存时才会发生,这会在main 返回时发生。
  • 基本的调试调查包括将其他东西连接到该信号并设置断点或输出消息,以查看它是否真的被触发了。
  • @DavidGrayson 谢谢。不幸的是,这无法回答我的问题。
  • 我看到的所有文献和类似的问答结果都有相同的答案:处理closeEvent

标签: c++ qt


【解决方案1】:

您的程序的这个修改版本展示了如何通过覆盖 w1 小部件上的 closeEvent(QCloseEvent *) 方法来做到这一点:

#include <QApplication>
#include <QtGui>
#include <QtCore>
#include <QtWidgets>

class MyWidget : public QWidget
{
public:
   MyWidget(QWidget * closeHim) : _closeHim(closeHim)
   {
      // empty
   }

   virtual void closeEvent(QCloseEvent * e)
   {
      QWidget::closeEvent(e);
      if (_closeHim) _closeHim->close();
   }

private:
   QWidget * _closeHim;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QWidget w2;
    w2.setWindowTitle("w2");
    w2.show();

    MyWidget w1(&w2);
    w1.setWindowTitle("w1");
    w1.show();

    return a.exec();
}

如果你想做得更优雅,你可以让你的closeEvent()方法覆盖发出一个信号,而不是调用指针上的方法;这样你就不会在两个类之间有直接的依赖关系,这会给你未来更大的灵活性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    相关资源
    最近更新 更多