首先看我这个博客,关于qt事件循环的原理:
qt源码解析1--事件循环原理(重写事件函数,事件过滤器等)_我是标同学的博客-CSDN博客_qt源码解析
先讲结论:
- 要想拖拽事件被触发,那么一定要支持接收拖放,即 setAcceptDrops(true);
- 拖拽事件无法ignore,只要子控件处理了该事件,那么父控件一定接收不到;
//qt的事件是当前控件接收的,由于editor总是在EditorsTabWidget控件表面,所以总是这里的editor优先接收到,也就是拦截了事件
//然而,拖拽事件会被阻止往父控件传递,即使调用了ignore函数,也传不到父控件了,但是别的类型事件就不是这样(比如键盘事件),估计是拖拽事件的特性吧
//其实editor本身也是需要处理拖拽事件的,比如选中一段文本,拖拽实现剪切或者复制功能,就是通过拖拽事件来实现的
//我们的EditorsTabWidget父控件要想拿到这个事件,那么就让editor别处理这个事件就行(因为处理完后调用ignore函数没用),所以下面的代码就是如果拖拽数据是超链接,那么就不处理了,这个事件就会自动传给父控件了
如下代码就能实现子控件和父控件协同处理各自的拖放事件啦
void Editor::dragEnterEvent(QDragEnterEvent *event)
{
//qt的事件是当前控件接收的,由于editor总是在EditorsTabWidget控件表面,所以总是这里的editor优先接收到,也就是拦截了事件
//然而,拖拽事件会被阻止往父控件传递,即使调用了ignore函数,也传不到父控件了,但是别的类型事件就不是这样(比如键盘事件),估计是拖拽事件的特性吧
//其实editor本身也是需要处理拖拽事件的,比如选中一段文本,拖拽实现剪切或者复制功能,就是通过拖拽事件来实现的
//我们的EditorsTabWidget父控件要想拿到这个事件,那么就让editor别处理这个事件就行(处理完后调用ignore函数没用),所以下面的代码就是如果
//拖拽数据是超链接,那么就不处理了,这个事件就会自动传给父控件了
if (event->mimeData()->hasUrls())
return;
QsciScintilla::dragEnterEvent(event);
}