【问题标题】:How can i move the QWidget in QGraphicsView?如何在 QGraphicsView 中移动 QWidget?
【发布时间】:2018-08-24 04:21:05
【问题描述】:

我想在 QGraphicsView 中移动 QPushButton 或某种 QWidget,例如 QListWidet、QTableWidget 等。

所以,我使用了 QGraphicsProxyWidget。

然后我单击小部件并拖动。但它不动。

如何移动 QWidget?

这是我的代码。

ui->graphicsView->setGeometry(0,0,geometry().width(),geometry().height());
scene = new QGraphicsScene(0, 0, geometry().width(), geometry().height(), this);

ui->graphicsView->setScene(scene);

btn =new QPushButton(NULL);
QGraphicsProxyWidget *proxy = scene->addWidget(btn);
proxy->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);
scene->addItem(proxy);

你能告诉我有什么问题吗?

谢谢。

【问题讨论】:

  • 一种常见的方法是处理主框架(按钮所在的位置)的鼠标按下、鼠标释放和鼠标移动事件,然后重新绘制按钮并刷新主框架。
  • 嗯.. 我不明白你的评论。那么,你能给我看一个小例子吗?谢谢宏地@macroland

标签: c++ qt qgraphicsview


【解决方案1】:

原因

在您的情况下,您无法移动按钮,因为尽管您已使代理可移动,但按钮以不同方式处理鼠标输入以实现其 clicked 功能。换句话说,在鼠标按下时,如何区分移动动作和点击动作?

解决方案

我的解决方案是让按钮成为更大的QGraphicsRectItem 的一部分。后者将用作可拖动句柄,即如果用户与按钮交互 - 它单击,但如果 QGraphicsRectItem 的其他部分(未被按钮覆盖)进行交互,则按钮可以移动。

示例

下面是一个例子,展示了如何做到这一点:

auto *item = new QGraphicsRectItem(0, 0, 75, 40);
auto *proxy = new QGraphicsProxyWidget(item);
auto *btn = new QPushButton(tr("Click me"));

btn->setGeometry(0, 0, 77, 26);

item->setFlag(QGraphicsItem::ItemIsMovable);
item->setBrush(Qt::darkYellow);

proxy->setWidget(btn);
proxy->setPos(0, 15);
proxy->setFlags(QGraphicsItem::ItemIsMovable|QGraphicsItem::ItemIsSelectable);

scene->addItem(item);

注意:要完成这项工作,将proxy 的父级设置为item 很重要。

【讨论】:

  • 感谢您的回答!祝你有美好的一天。
  • @yoon,这对你有帮助吗?
  • @yoon 如果答案有效,您可以标记为正确。
  • @scopchanov,当然,这是非常有用的信息。实际上,我想在没有 QGraphicsRectItem 的情况下移动小部件。但在我的研究结果中,也许是不可能的。如果您知道如何在没有 QGraphicsRectitem 或任何容器的情况下移动小部件。你能提供一些信息吗? ——
  • @yoon,你想移动一个小部件,比如说一个 QPushButton,没有 QGraphicsItem,对吧?我说这是可能的,但前提是你找到一种方法来区分两个事件:1. 用户在按钮上按下鼠标并意图单击它 2. 用户在按钮上按下鼠标意图移动它。 presspress and hold 是这种区分的一个例子。在这种情况下,您不需要 QGraphicsRectItem,但您必须继承 QPushButton 并重新实现鼠标事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多