我创建了一个新的QWidget对象,我想知道何时按下关闭按钮。
我尝试了以下代码:
pWindow = new QWidget();
connect(pWindow , SIGNAL(triggered()), this, SLOT(processCloseButtonWindowsClicked()));
但是它给出了一个错误:
没有触发pWindow的信号
如何实现?
答案 0 :(得分:3)
QWidget
没有triggered
信号。
我建议您:
子类QWidget
和重新实现QWidget::closeEvent
选中QEvent::spontaneous
,以区分单击关闭按钮和调用QWidget::close
根据您应用的逻辑,调用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()));
有关更多信息: