Qt事件处理(二)——事件处理链

来源:互联网 发布:idc服务商网站php源码 编辑:程序博客网 时间:2024/06/04 23:25

目录

  • 目录
  • 前言
  • 事件处理链
    • 原理描述
    • ignore和accept
    • 代码
  • 总结

前言

最近遇到 一个问题,想要在QLabel上显示图像的同时,用鼠标选定特定目标并画矩形圈出物体。但是显示图像之后,画的矩形是在widget窗口下,而不是在QLabel上。后来全都在QLabel中处理,但是出现另外一个问题,就是我在子窗口中画矩形成功,显示矩形也是成功的,但是鼠标的坐标不正确,这时候因为我是在子对象中对鼠标事件进行处理,然后无法进行坐标设置。还是对Qt的事件处理不是很了解。感觉这篇博客有希望解决。
学习!分享!感谢!

事件处理链

原理描述

控件之间如果具有父子关系,如果子对象不对事件进行处理,可以选择传递给父对象进行处理。如果父对象不处理,可以传递给父对象的父对象进行处理。但是我们需要对对应的控件进行继承,这样我们才能重写对应的事件处理函数,然后用我们自己的方式对事件进行处理。

ignore()accept()

Qt中我们对事件可以选择忽略或者处理,默认情况是处理的。我们可以选择对事件进行处理,然后调用event->ignore()函数,这样表示我们对事件的处理选择忽略。但是在忽略之前,我们还是可以进行一些处理内容。然后在忽略之后,事件就会传递到控件的父对象,这样父对象就能再次对发生的事件进行处理。
注意:必须继承控件,然后重写父控件中的事件处理函数

代码

  • main.cpp
#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    MainWindow w;    w.show();    return a.exec();}
  • mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QtWidgets>namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow();private:    Ui::MainWindow *ui;    bool continueToClose()    {        if(QMessageBox::question(this, tr("Quit"), tr("Are you sure to quit this application?"),                QMessageBox::Yes | QMessageBox::No,                QMessageBox::No) == QMessageBox::Yes)        {            return true;        }        else        {            return false;        }    }protected:    void mousePressEvent(QMouseEvent *event)    {        QMessageBox::information(this, tr("Test"), tr("MainWindow"));        event->ignore();    }    // if we accept closeEvent,the widget will be close    void closeEvent(QCloseEvent *event)    {        if(continueToClose())        {            event->accept();        }        else        {            event->ignore();        }    }};// only we inherit, then we can reload the event functionclass MyTabWidget : public QTabWidget{protected:    void mousePressEvent(QMouseEvent *event)    {        QMessageBox::information(this, tr("Test"), tr("This is TabWidget"));        event->ignore();    }};class MyTab : public QWidget{protected:    void mousePressEvent(QMouseEvent *event)    {        QMessageBox::information(this, tr("Test"), tr("This is Tab"));        event->ignore();    }};class MyGroupBox : public QGroupBox{public:    explicit MyGroupBox(const QString& title, QWidget* parent = 0):        QGroupBox(title, parent){}protected:    void mousePressEvent(QMouseEvent *event)    {        QMessageBox::information(this, tr("Test"), tr("This is GroupBox"));//        event->ignore();    }};class MyCheckBox : public QCheckBox{public:    explicit MyCheckBox(const QString &text, QWidget *parent = 0):        QCheckBox(text, parent){}protected:    void mousePressEvent(QMouseEvent *event)    {        QMessageBox::information(this, tr("Test"), tr("This is CheckBox"));        event->ignore();//        event->accept();    // default is accept();    }};#endif // MAINWINDOW_H
  • mainwindow.cpp
#include "mainwindow.h"#include "ui_mainwindow.h"#include <QtWidgets>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    MyTabWidget *tabWidget = new MyTabWidget;    MyTab *firstTab, *secondTab;    firstTab = new MyTab;    secondTab = new MyTab;    // groupBox's parent is firstTab, firstTab's parent is tabWidget    // MainWindow is tabWidget's parent    MyGroupBox *groupBox = new MyGroupBox(tr("Demo Group"), firstTab);    groupBox->setGeometry(100, 100, 300, 200);    // checkBox's parent is groupBox, so setGeometry is in groupBox    MyCheckBox *checkBox = new MyCheckBox(tr("checkBOx"), groupBox);    checkBox->setGeometry(50, 50, 100, 80);    tabWidget->addTab(firstTab, tr("FirstTab"));    tabWidget->addTab(secondTab, tr("SecondTab"));    this->setCentralWidget(tabWidget);}MainWindow::~MainWindow(){    delete ui;}

这个程序中实现的是在checkBox控件中产生鼠标按下事件,这时候默认checkBox控件会接收鼠标按下事件,如果我们选择ignore,事件就会传递给checkBox的父控件groupBox进行处理,groupBox可以选择acceptignore来终止事件的传递。
另外一个功能是,如果我们关闭整个窗口,会弹出窗口对话框,来判断我们是否真的要关闭这个窗口,涉及到closeEvent()

总结

目前感觉,学习Qt就是学习API,了解的多了就能解决问题。只要肯下功夫,多学习,Qt其实也不难。不过只是初步学习,努力吧!感觉还是看需求,当然基础也要好才行!