我创建了一个新的QWidget对象,并且想知道何时按下关闭按钮。
我尝试了以下代码:
pWindow = new QWidget();
connect(pWindow , SIGNAL(triggered()), this, SLOT(processCloseButtonWindowsClicked()));
但是它会报错:
pWindow未触发任何信号
如何实现此功能?
我创建了一个新的QWidget对象,并且想知道何时按下关闭按钮。
我尝试了以下代码:
pWindow = new QWidget();
connect(pWindow , SIGNAL(triggered()), this, SLOT(processCloseButtonWindowsClicked()));
但是它会报错:
pWindow未触发任何信号
如何实现此功能?
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();
}
};
close()
时,也会调用closeEvent()
,这两者之间的区别是什么? - eyllanesc在开始之前,先检查一下Qt是否有你想要做的类。也许你想要实现的功能可以使用QDialog而不是QWidget。
以下代码:假设你想要在X被点击时删除小部件,并且你只想知道何时执行某些操作。尝试连接你的小部件的基类QObject的信号,当它被销毁时:
-你的小部件
-属性设置为在X(关闭按钮)被点击或close()处理程序被触发后销毁你的小部件
-将destroyed()信号连接到你想要在销毁之前执行某些操作的任何槽上
pWindow = new QWidget();
pWindow->setAttribute(Qt::WA_DeleteOnClose,true);
connect(pWindow , SIGNAL(destroyed()), this,SLOT(processCloseButtonWindowsClicked()));
更多信息请见: