重写事件处理器函数 2个月前

重写事件处理器函数

由于事件处理器函数都是虚函数,因此我们就可以添加一个标准窗口类的派生类,这样不仅使子类继承了父类的属性,还可以在这个子类中重写父类的虚函数,总起来说整个操作过程还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事件中添加了关闭窗口的判断,这样就可以避免误操作导致窗口被关闭了,效果如下: image

如果想要时时检测窗口大小,就可以重写窗口的resizeEvent事件,这样就可以得到窗口的最新尺寸信息了: image

image
EchoEcho官方
无论前方如何,请不要后悔与我相遇。
1377
发布数
439
关注者
2223188
累计阅读

热门教程文档

Spring Cloud
8小节
Javascript
24小节
Maven
5小节
Typescript
31小节
Golang
23小节