【问题标题】:How to detect that the close button of QWidget is pressed?如何检测 QWidget 的关闭按钮被按下?
【发布时间】:2019-04-09 09:40:33
【问题描述】:

我创建了一个新的QWidget 对象,我想知道何时按下关闭按钮。

我已经尝试了以下代码:

pWindow = new QWidget();
connect(pWindow , SIGNAL(triggered()), this, SLOT(processCloseButtonWindowsClicked()));

但它给出了一个错误:

pWindow 无信号触发

如何做到这一点?

【问题讨论】:

  • 你的操作系统是什么?
  • @eyllanesc 我在 Windows 操作系统中工作

标签: c++ qt


【解决方案1】:

原因

QWidget 没有triggered 信号。

解决方案

我建议你:

  1. 子类QWidget并重新实现QWidget::closeEvent

  2. 检查QEvent::spontaneous 以区分单击关闭按钮和调用QWidget::close

  3. 根据您应用的逻辑,调用QWidget::closeEvent(event); 关闭小部件,或调用QEvent::ignore 使其保持打开状态

示例

我为您准备了一个示例,说明如何实施建议的解决方案:

#include <QMainWindow>
#include <QCloseEvent>
#include <QPushButton>

class FooWidget : public QWidget
{
    Q_OBJECT
public:
    explicit FooWidget(QWidget *parent = nullptr) :
        QWidget(parent) {
        auto *button = new QPushButton(tr("Close"), this);
        connect(button, &QPushButton::clicked, this, &FooWidget::close);
        resize(300, 200);
        setWindowTitle("Foo");
    }

protected:
    void closeEvent(QCloseEvent *event) override {

        if (event->spontaneous()) {
            qDebug("The close button was clicked");
            // do event->ignore();
            // or QWidget::closeEvent(event);
        } else {
            QWidget::closeEvent(event);
        }
    }
};

class MainWindow : public QMainWindow
{
    Q_OBJECT
    FooWidget *pWindow;
public:
    explicit MainWindow(QWidget *parent = nullptr) :
        QMainWindow(parent),
        pWindow(new FooWidget()) {
        pWindow->show();
    }
};

【讨论】:

  • close()被调用时,closeEvent()也被调用,作为点击按钮和调用close()的区别?
  • @eyllanesc,你的意思是如何区分调用关闭和点击关闭按钮?
  • 是的,因为OP想检测按钮何时被点击:如何检测QWidget的关闭按钮被按下?跨度>
  • @eyllanesc,我现在明白了。你是对的,我已经在挖掘代码以找到区分两者的方法。
  • 感谢@scopchanov 和@eyllanesc,我认为检测QWidget 的关闭按钮以覆盖closeEvent()
【解决方案2】:

void QWidget::closeEvent(QCloseEvent *event) 将是我可能采用的方式。

您可以阅读文档here.

【讨论】:

    【解决方案3】:

    在此之前,请检查 Qt 是否有你想做的类。也许您想使用 QDialog 而不是 QWidget 来实现您想要实现的目标。

    以下代码:假设您想在单击 X 时删除小部件,并且您只想知道何时执行某项操作。 尝试在您的小部件被销毁时连接来自基类 QObject 的信号:

    -你的小部件

    -属性设置为在 X(closebotton 被点击)或 close() 处理程序被触发后销毁你的小部件

    -将destroyed() 信号连接到你想要在它被销毁之前做某事的任何槽

    pWindow = new QWidget();
    pWindow->setAttribute(Qt::WA_DeleteOnClose,true);
    connect(pWindow , SIGNAL(destroyed()), this,SLOT(processCloseButtonWindowsClicked()));
    

    更多信息:

    https://doc.qt.io/qt-5/qwidget.html#close

    https://doc.qt.io/qt-5/qobject.html#destroyed

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 2017-04-11
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多