Как определить, что нажата кнопка закрытия QWidget? - PullRequest
0 голосов
/ 06 ноября 2018

Я создаю новый QWidget объект и хочу знать, когда нажимается кнопка закрытия.

Я пробовал следующий код:

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

но выдает ошибку:

Нет сигнала от pWindow

Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

void QWidget :: closeEvent (событие QCloseEvent *) будет возможным путем, с которым я бы пошел.

С документацией можно ознакомиться здесь.

0 голосов
/ 06 ноября 2018

Причина

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();
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...