如何检测QWidget的关闭按钮被按下?

Ngu*_*yen 5 c++ qt

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

我尝试了以下代码:

pWindow = new QWidget();
connect(pWindow , SIGNAL(triggered()), this, SLOT(processCloseButtonWindowsClicked()));
Run Code Online (Sandbox Code Playgroud)

但它给出了一个错误:

pWindow 无信号触发

如何实现这一目标?

sco*_*nov 5

原因

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();
    }
};
Run Code Online (Sandbox Code Playgroud)