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

10

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

我尝试了以下代码:

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

但是它会报错:

pWindow未触发任何信号

如何实现此功能?


你的操作系统是什么? - eyllanesc
@eyllanesc 我在使用Windows操作系统。 - Nguyen Huu Tuyen
3个回答

13

原因

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(),这两者之间的区别是什么? - eyllanesc
@eyllanesc,您的意思是如何区分关闭调用和点击关闭按钮吗? - scopchanov
是的,因为 OP 想要检测按钮何时被点击:如何检测 QWidget 的“关闭”按钮被按下? - eyllanesc
@eyllanesc,我现在明白了。你是对的,我已经在代码中挖掘,寻找区分它们的方法了。 - scopchanov
1
感谢@scopchanov和@eyllanesc,我认为可以检测QWidget的关闭按钮以覆盖closeEvent()函数。 - Nguyen Huu Tuyen

0

在开始之前,先检查一下Qt是否有你想要做的类。也许你想要实现的功能可以使用QDialog而不是QWidget。

以下代码:假设你想要在X被点击时删除小部件,并且你只想知道何时执行某些操作。尝试连接你的小部件的基类QObject的信号,当它被销毁时:

-你的小部件

-属性设置为在X(关闭按钮)被点击或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


-1

我会选择使用void QWidget::closeEvent(QCloseEvent *event)。

您可以在这里阅读文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接