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

时间:2018-11-06 00:57:40

标签: c++ qt

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

我尝试了以下代码:

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

但是它给出了一个错误:

  

没有触发pWindow的信号

如何实现?

3 个答案:

答案 0 :(得分:3)

原因

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();
    }
};

答案 1 :(得分:0)

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

您可以阅读文档here.

答案 2 :(得分:0)

在检查Qt是否具有要执行的操作的类之前。也许您想使用QDialog而不是QWidget来存档。

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

-您的小部件

-属性设置为在X(单击closebotton被单击)或触发close()处理函数后销毁小部件

-将destroy()信号连接到要在销毁之前要执行操作的任何插槽上

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