关于qt的拖拽事件原理

首先看我这个博客,关于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);
}

猜你喜欢

转载自blog.csdn.net/kangkanglhb88008/article/details/128278938
今日推荐