将 QWidget 中心位置映射到 QGraphicsScene 坐标?

Map QWidget center position to QGraphicsScene coordinates?

我有一个带有嵌入式 QWidget 的 QGraphicsItem,这个 QWidget 中有一个 QPushButton。 我正在尝试将 QPushButton 的中心映射到 QGraphicsScene 坐标,例如,我可以将一个 Circle 添加到 QPushButton 的中心。

在另一个 post 的帮助下,我找到了 QPushButton 的中心,但它与它在 QGraphicsScene 中的实际位置不符。

我尝试了什么:

  1. 获取按钮的QRect,然后获取其中心,最后映射到视图的全局坐标。

  2. 获取按钮的 QRect,然后获取其中心并将其映射到 QGraphicsItem。

  3. 获取按钮的 QRect,然后是它的中心,将其映射到 QGraphicsItem,然后将其映射到场景。

一般来说,我尝试将它映射到场景、全局和项目,但它看起来总是不正确。而且我将 QGraphicsItem 移动得越远,它就越不准确。这里的圆应该位于“B”按钮的中心:

Qwidget:

class NodeFrame : public QFrame
{
public:
  NodeFrame();
  QRect getButtonRect()
  {
    return layout->itemAt(0)->geometry();
  }
  
private:
  QPushButton* button = nullptr;
  QHBoxLayout* layout = nullptr;
};

NodeFrame::NodeFrame()
{
  setFixedSize(200,80);
  
  // Creates and add a QPushButton to the frame.
  // I need the position of this button on the QGraohicsScene
  button = new QPushButton("B");
  button->setFixedSize(40,20);
  
  layout = new QHBoxLayout();
  layout->addWidget(button);
  layout->setAlignment(Qt::AlignCenter);
  setLayout(layout);
}

QGraphicsItem:

class Node : public QGraphicsItem
{
public:
  Node();
  QRectF boundingRect() const override;
  void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
  
  QRect getButtonRect()
  {
    return frame->getButtonRect();
  }
  
  NodeFrame* frame = nullptr;
};

Node::Node()
{
  setFlag(ItemIsMovable);

  // Create a GraphicsProxyWidget to insert the nodeFrame into the scene
  auto proxyWidget = new QGraphicsProxyWidget(this);
  frame = new NodeFrame();
  proxyWidget->setWidget(frame);
  // Center the widget(frame) at the center of the QGraphicsItem
  proxyWidget->setPos(boundingRect().center() - proxyWidget->boundingRect().center());
}

QRectF Node::boundingRect() const
{
  return QRectF(-10, -10, 280, 150);
}

void Node::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
{
  QPainterPath path;
  path.addRoundedRect(boundingRect(), 10, 10);
  painter->drawPath(path);
}

主要内容:

int main(int argc, char* argv[])
{
  QApplication app(argc, argv);
  
  // Create scene and view
  auto scene = new QGraphicsScene();
  auto view = new QGraphicsView(scene);
  
  view->setMinimumSize(800, 800);
  
  // Create the QGraphicsItem and add it to the scene
  auto item = new Node();
  scene->addItem(item);
  item->setPos(50, 50);

  
  auto btnRect = item->getButtonRect();
  auto center = view->mapToGlobal(btnRect.center());
  auto circle = new QGraphicsEllipseItem();
  circle->setRect(QRectF(center.x(), center.y(), 25, 25));
  scene->addItem(circle);


  // Show the the view
  view->show();
  return app.exec();
}

感谢任何帮助。

已解决。这是由两件事造成的:

1:QRectF getButtonRect() 返回 layout->itemAt(0)->geometry(),(索引 0 是布局中的第一个也是唯一的小部件)但 button->frameGeometry() 似乎是按钮的更准确的视觉表示几何.

2:当使用 QGraphicsProxyWidget 将小部件添加到图形项时,我正在使用以下方法调整图形项中小部件的位置:

proxyWidget->setPos(boundingRect().center() - proxyWidget->boundingRect().center());

这(很明显)改变了小部件在图形项中的位置,因此在视觉上它与 button->frameGeometry() 给出的结果不一致。