使 QWidget 的一部分可拖动

Posted

技术标签:

【中文标题】使 QWidget 的一部分可拖动【英文标题】:Making part of a QWidget draggable 【发布时间】:2012-10-21 10:15:06 【问题描述】:

我有一个 USB 设备可以

沿线性轴“移动”, 停在目标处, 报告其位置, 报告其目标, 由宿主应用程序设置其目标。

现在我想创建一个可以用来指示位置和目标的小部件,但我还希望目标指示器可以用鼠标拖动。到目前为止我完成的是指示部分,它看起来像这样:

黑色的实心三角形是位置;目标指示灯为绿色。

我想要的是能够拖动目标指示器。完成此操作时,设备的目标应使用当前目标指标的值进行更新。我是 gui 编程的新手(直到现在我只处理 USB 的东西;这是我的第一个自定义小部件),我不知道如何实现这一点。

将目标指示器作为小部件的一部分保留是个好主意,还是应该是某种子项?我很确定这种工作有一些共同的模式,但我不知道找到它们的正确关键字。谷歌搜索“QWidget drag”之类的东西只会让我找到拖放功能,这并不是我所需要的。

【问题讨论】:

【参考方案1】:

我认为您不应该为子小部件而烦恼。在你的主 QWidget 中,你只需要重写三个虚拟保护函数:

QWidget::mousePressEvent -- 这应该检查用户是否点击了目标指示器,如果是,则将 bool "clickedOnIndicator" 设置为 true(并接受鼠标事件);否则设置bool为false,忽略鼠标事件,调用默认实现

QWidget::mouseMoveEvent -- 首先检查clickedOnIndicator 是否为真;如果是,则将指标移动到新位置并发出信号YourWidget::indicatorMoved(int),否则调用默认实现

QWidget::paintEvent -- 将指示器绘制在正确的位置(并执行您在绘制事件中所做的任何其他事情)

【讨论】:

谢谢,会努力实现的。仍然存在一个问题:设备可能会在拖动过程中报告其旧位置 - 这会干扰拖动吗? 我不这么认为...它会干扰什么? 假设旧目标是 0.6,我将指标拖到 0.4,设备可以继续报告目标 0.6,重置目标位置,直到我再次移动鼠标 - 指标可能“跳跃” ,不是吗? 我不太清楚你的意思。信号YourWidget::indicatorMoved(int) 只会在您单击并拖动鼠标时发出。大概您会将此信号连接到某个插槽,该插槽会告诉 USB 设备新的指示器位置。不应该有任何无限递归。 好像可以了,现在只剩下坐标计算问题了。谢谢!

以上是关于使 QWidget 的一部分可拖动的主要内容,如果未能解决你的问题,请参考以下文章

半透明 QWidget 应该是可点击的跨操作系统

使自定义 QWidget 可选

两个QWidget叠加,可部分代替layout的功能

用鼠标改变 QWidget 的宽度

QT UI 使一个QWidget里面的元素自动填充满本QWidget

Qt:在 QGraphicsView/QGraphicsScene 上有一个孩子的 QWidget 不工作