目录
前言
最近遇到 一个问题,想要在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
{