首页 文章

在X上拖动对象下方缓慢重绘... Qt强制拖放操作只能在内部进行吗?

提问于
浏览
16

我正在 WindowsX 实现 Qt 的拖放API . 当我在 X 上运行的应用程序中拾取一个对象并将其拖动时,它会在下面的窗口上留下一条白色的幽灵痕迹,就好像下面的窗口缓慢重新绘制被拖动的对象先前遮挡其中一部分的位置 .

我相信这是Qt刚刚用resizing windows causing flicker in child widgets on X windows解决的同一问题的症状 - i.e. the dragged object is treated as a separate native window and therefore X handles the clipping from the dragged object to the window underneath. 由于 X 以与 Qt 不同的方式做到这一点,我们得到重影效果 .

有谁遇到过同样的问题?我想到的一个解决方案是使用与上面链接的博客文章中详述的相同技术,并停止拖动对象被视为本机窗口,可能以拖放为代价仅限于我的应用程序(我没有问题) . 有谁知道如何强制拖放操作只是内部?


EDIT: 我正在使用 QDrag::setPixmap 来设置被拖动对象的图形表示 - 重要的是我保留它以支持标准拖动光标,因为此接口正在触摸屏设备上使用,因此没有可见光标 .

2 回答

  • 1

    我现在认为没有编辑,然后编译我自己的Qt版本(不是我的选项),我不能强制拖放操作只是内部 .

    同样,我找不到通过调整我的窗口管理器设置或使用合成窗口管理器来摆脱鬼痕的任何方法(无论如何,感谢@atomice) . 使用OpenGL作为渲染器会稍微增加屏幕重绘速度,但并不完美并且会引入自己的问题(请参阅Starting a Qt drag operation on X11 w/ OpenGL causes screen flicker) . 我仍然会非常有兴趣听到任何想法 .

    但是,我有一个解决方法,我的问题适用于Windows和X.这是一个简化版本:

    void DoDrag()
    {
      //Prepare the graphical representation of the drag
      mDragRepresenter = new QWidget(QApplication::activeWindow());
      mDragRepresenter->setAttribute(Qt::WA_TransparentForMouseEvents);
      mDragRepresenter->SetPixmap(GenerateDragPixmap());
    
      RepositionDragRepresenter();
      mDragRepresenter->show();
    
      QTimer UpdateTimer;
      connect(&UpdateTimer, SIGNAL(timeout()), this, SLOT(RepositionDragRepresenter()));
      UpdateTimer.start(40);
    
      //Start the drag (modal operation)
      Qt::DropAction ResultingAction = Drag->exec(Qt::CopyAction);
    
      UpdateTimer.stop();
      delete mDragRepresenter;
    }
    
    void RepositionDragRepresenter()
    {
      mDragRepresenter->move(QApplication::activeWindow()->mapFromGlobal(QCursor::pos()) - mDragRepresenterHotSpot);
    }
    
  • 0

    如果QDrag :: mimeData() - > hasImage()为true,则仅为拖动操作创建X11窗口 . 如果您修改代码使其不使用图像,那么您将获得一个拖动光标,而不会触发下面窗口的重绘 .

    您没有指定要拖动的对象类型或设置拖动操作的方式 . 你能添加一些代码来表明吗?

相关问题