使用 USB 触摸屏拖放 Qt 5.5 中的错误?
Drag'n'drop bug in Qt 5.5 with USB touchscreen?
我试图在 linux Qt 应用程序中使用带有自定义 QAbstractTableModel 的 QTableView 中的拖放,但是有一个问题。我将其追踪到一个与 QTableWidget 一起使用的简约示例,因为存在相同的问题并且更容易重现。
当我开始拖动 QTableWidget 的单元格时,通常应该绘制被拖动单元格的内容并粘在鼠标光标上。在我的 Windows 机器上,这就像一个魅力 (见图 1,抱歉质量差,但我不得不使用我的相机,否则我无法保持阻力)。
如果我 运行 在连接了触摸屏的嵌入式系统 (ARM) 上使用完全相同的代码,则拖动单元格的内容**不会*绘制在光标上,而是在屏幕左上角(只有一个 'half' 可见,另一半在视口外,参见图 2)。
Windows:
带触摸的嵌入式系统(没有可见的鼠标光标):
uname -a 在我的嵌入式系统上:
Linux fsimx6 3.0.35-F+S #3 SMP PREEMPT Sun Oct 4 15:41:19 CEST 2015 armv7l GNU/Linux
Qt 版本: 5.5.0
重现方式:
将 QTableWidget 放入您的应用程序,确保 showDropIndicator、dragEnabled 和 dragDropOverwriteMode 设置为 true,dragDropMode 设置为 DragDrop,defaultDropAction 设置为 MoveAction。
我刚刚发现(在撰写本文时 post)当我连接 USB 鼠标而不是使用 USB 触摸屏时,它也适用于我的嵌入式系统。不同之处在于,使用 USB 鼠标时,应用程序中会显示一个鼠标光标。连接触摸屏 (eGalax Inc. eGalaxTouch EXC3000-0408-35.00.00) 时,不会自动绘制光标(Qt 的决定?)。
当我使用触摸屏连接从 dragMoveEvent() 方法输出 event.pos() 时,我看到了正确的 x/y-positions,所以光标符号和蓝色内容框之间可能存在某种联系?
我只是在这里推测,但似乎拖动的实现与鼠标/光标有关。由于触摸没有光标,拖动时被拖动的元素没有光标跟随,因此它固定在 0x0。问题可能出在对小部件的基本触摸支持或您的平台插件中,尽管我怀疑是前者。在 windows 下使用触摸屏进行测试以验证这一点。
如果在 0x0 处有一个隐藏的光标,您可以尝试手动将其绑定到触摸位置,希望能解决问题。例如 .
如果这不起作用,您可以实现自己的触摸拖放机制。对于小部件来说,这可能会变得非常乏味,我已经在 QML 中完成了自定义拖放操作,这非常简单。
此外,您可以尝试查看拖动在 QML 中是否正常工作,QML 更新且更以触摸为中心。旧的 QtWidgets 模块几乎已成定局,在设计时并未真正考虑到触摸。 QML 使用起来非常简单快捷,所以我建议您使用它,除非您需要旧小部件的额外功能,而这些功能在 QtQuick Controls 的 QML 小部件类似物中仍未完全实现。
我试图在 linux Qt 应用程序中使用带有自定义 QAbstractTableModel 的 QTableView 中的拖放,但是有一个问题。我将其追踪到一个与 QTableWidget 一起使用的简约示例,因为存在相同的问题并且更容易重现。
当我开始拖动 QTableWidget 的单元格时,通常应该绘制被拖动单元格的内容并粘在鼠标光标上。在我的 Windows 机器上,这就像一个魅力 (见图 1,抱歉质量差,但我不得不使用我的相机,否则我无法保持阻力)。
如果我 运行 在连接了触摸屏的嵌入式系统 (ARM) 上使用完全相同的代码,则拖动单元格的内容**不会*绘制在光标上,而是在屏幕左上角(只有一个 'half' 可见,另一半在视口外,参见图 2)。
Windows:
带触摸的嵌入式系统(没有可见的鼠标光标):
uname -a 在我的嵌入式系统上:
Linux fsimx6 3.0.35-F+S #3 SMP PREEMPT Sun Oct 4 15:41:19 CEST 2015 armv7l GNU/Linux
Qt 版本: 5.5.0
重现方式:
将 QTableWidget 放入您的应用程序,确保 showDropIndicator、dragEnabled 和 dragDropOverwriteMode 设置为 true,dragDropMode 设置为 DragDrop,defaultDropAction 设置为 MoveAction。
我刚刚发现(在撰写本文时 post)当我连接 USB 鼠标而不是使用 USB 触摸屏时,它也适用于我的嵌入式系统。不同之处在于,使用 USB 鼠标时,应用程序中会显示一个鼠标光标。连接触摸屏 (eGalax Inc. eGalaxTouch EXC3000-0408-35.00.00) 时,不会自动绘制光标(Qt 的决定?)。
当我使用触摸屏连接从 dragMoveEvent() 方法输出 event.pos() 时,我看到了正确的 x/y-positions,所以光标符号和蓝色内容框之间可能存在某种联系?
我只是在这里推测,但似乎拖动的实现与鼠标/光标有关。由于触摸没有光标,拖动时被拖动的元素没有光标跟随,因此它固定在 0x0。问题可能出在对小部件的基本触摸支持或您的平台插件中,尽管我怀疑是前者。在 windows 下使用触摸屏进行测试以验证这一点。
如果在 0x0 处有一个隐藏的光标,您可以尝试手动将其绑定到触摸位置,希望能解决问题。例如
如果这不起作用,您可以实现自己的触摸拖放机制。对于小部件来说,这可能会变得非常乏味,我已经在 QML 中完成了自定义拖放操作,这非常简单。
此外,您可以尝试查看拖动在 QML 中是否正常工作,QML 更新且更以触摸为中心。旧的 QtWidgets 模块几乎已成定局,在设计时并未真正考虑到触摸。 QML 使用起来非常简单快捷,所以我建议您使用它,除非您需要旧小部件的额外功能,而这些功能在 QtQuick Controls 的 QML 小部件类似物中仍未完全实现。