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
可以选择accept
或ignore
来终止事件的传递。
另外一个功能是,如果我们关闭整个窗口,会弹出窗口对话框,来判断我们是否真的要关闭这个窗口,涉及到closeEvent()
。
总结
目前感觉,学习Qt就是学习API
,了解的多了就能解决问题。只要肯下功夫,多学习,Qt其实也不难。不过只是初步学习,努力吧!感觉还是看需求,当然基础也要好才行!
- Qt事件处理(二)——事件处理链
- Qt事件处理(二)
- QT——事件处理机制
- Qt学习笔记——事件处理
- Qt事件处理(五)——定时器
- 浅议Qt的事件处理机制 二
- 浅议Qt的事件处理机制 二
- 浅议Qt的事件处理机制 二
- (二十八)Qt中的事件处理
- [Q学习]10 Qt事件系统——处理事件
- Qt事件处理(三)——事件过滤器
- Qt事件处理-事件过滤器
- Qt事件处理-事件过滤器
- QT事件处理(二) 之 事件过滤器
- QT事件处理(二) 之 事件过滤器
- qt中的事件处理
- QT 事件处理
- Qt事件处理机制
- spring中的scope详解
- JS判断用户使用的是手机还是电脑?
- nmake命令编译器的使用
- jboss 日志按天生成
- 操作系统学习02
- Qt事件处理(二)——事件处理链
- 如何更改U盘的图标
- 家族
- perl 中文处理 乱码
- tomcat使用问题解决记录
- 【Deep Learning】Tensorflow MNIST测试
- 安装Anaconda3
- MySQL的几种join
- java并发编程学习13--Atomic数据结构简介