编程语言
133
重写事件处理器函数
由于事件处理器函数都是虚函数,因此我们就可以添加一个标准窗口类的派生类,这样不仅使子类继承了父类的属性,还可以在这个子类中重写父类的虚函数,总起来说整个操作过程还easy
创建一个Qt项目,添加一个窗口类(让其从某个标准窗口类派生) 2. 在子类中重写从父类继承的虚函数(也就是事件处理器函数)
1. 头文件
#include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); protected: // 重写事件处理器函数 void closeEvent(QCloseEvent* ev); void resizeEvent(QResizeEvent* ev); private: Ui::MainWindow *ui; };
2. 源文件
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QCloseEvent> #include <QMessageBox> #include <QResizeEvent> #include <QDebug> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::closeEvent(QCloseEvent *ev) { QMessageBox::Button btn = QMessageBox::question(this, "关闭窗口", "您确定要关闭窗口吗?"); if(btn == QMessageBox::Yes) { // 接收并处理这个事件 ev->accept(); } else { // 忽略这个事件 ev->ignore(); } } void MainWindow::resizeEvent(QResizeEvent *ev) { qDebug() << "oldSize: " << ev->oldSize() << "currentSize: " << ev->size(); }
QCloseEvent
类是QEvent
类的子类,程序中使用的accept()
或者ignore()
的作用参考时间分发器部分的QEvent
类
3. 效果
在上面重写的closeEvent
事件中添加了关闭窗口的判断,这样就可以避免误操作导致窗口被关闭了,效果如下:
如果想要时时检测窗口大小,就可以重写窗口的resizeEvent
事件,这样就可以得到窗口的最新尺寸信息了: