Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在X上拖动的对象下方缓慢重新绘制。。。Qt强制拖放操作只能是内部操作吗?_Qt_Drag And Drop_X11 - Fatal编程技术网

在X上拖动的对象下方缓慢重新绘制。。。Qt强制拖放操作只能是内部操作吗?

在X上拖动的对象下方缓慢重新绘制。。。Qt强制拖放操作只能是内部操作吗?,qt,drag-and-drop,x11,Qt,Drag And Drop,X11,我正在实现Qt在Windows和X之间的拖放API。当我在运行于X的应用程序中拾取一个对象并拖动它时,它会在下面的窗口上留下一条白色的幻影轨迹,就好像下面的窗口在重新绘制之前被拖动的对象遮挡了其自身的一部分时,速度很慢 我认为这是Qt刚刚用-解决的同一问题的症状,即被拖动对象被视为一个单独的本机窗口,因此X处理从被拖动对象到下方窗口的剪辑。因为X以与Qt不同的方式执行此操作,我们得到了鬼影效应 有没有人经历过同样的问题?想到的一个解决方案是使用与上面链接的博客文章中详细介绍的相同的技术,并停止将

我正在实现QtWindowsX之间的拖放API。当我在运行于X的应用程序中拾取一个对象并拖动它时,它会在下面的窗口上留下一条白色的幻影轨迹,就好像下面的窗口在重新绘制之前被拖动的对象遮挡了其自身的一部分时,速度很慢

我认为这是Qt刚刚用-解决的同一问题的症状,即被拖动对象被视为一个单独的本机窗口,因此X处理从被拖动对象到下方窗口的剪辑。因为X以与Qt不同的方式执行此操作,我们得到了鬼影效应

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



编辑:我正在使用
QDrag::setPixmap
设置被拖动对象的图形表示法-我保留这一点以支持标准拖动光标是很重要的,因为此界面在触摸屏设备上使用,因此没有可见的光标。

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


您不指定要拖动的对象类型或设置拖动操作的方式。你能添加一些代码来说明这一点吗?

我现在的观点是,如果不编辑并编译我自己的Qt构建(对我来说不是一个选项),我不能强制拖放操作仅限于内部

同样地,我也无法通过调整窗口管理器设置或使用合成窗口管理器(尽管@Atomices)来摆脱幽灵踪迹。使用OpenGL作为渲染器略微提高了屏幕重新绘制的速度,但这并不完美,并且会带来自身的问题(请参阅)。不过,我还是很想听听你的想法

然而,我已经为我的问题找到了一个解决办法,它可以在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);
}

问得好,对不起,我帮不了你。但有一件事很引人注目,那就是你的实际问题出现在你文章的最后一行。试着将标题的措辞作为你的问题,稍后再解释情况。可能有助于找到合适的人看看你的问题。干杯Cheers@Robin,听了你的建议:)这个界面将在没有光标的触摸屏上使用,所以恐怕需要一个图像。老实说,该对象与此无关-我正在以标准方式设置拖动(即
new
将其关闭,设置
mimeData
pixmap
hotSpot
,然后调用
QDrag::exec()
)。不过,我没有想到尝试
setCursor
而不是
setPixmap
——我明天会试一试。干杯:)如果这是一个信息亭或设备(而不是一个通用应用程序),如果硬件支持,你可以尝试使用合成窗口管理器。