将 QWidget 中心位置映射到 QGraphicsScene 坐标?
Map QWidget center position to QGraphicsScene coordinates?
我有一个带有嵌入式 QWidget 的 QGraphicsItem,这个 QWidget 中有一个 QPushButton。
我正在尝试将 QPushButton 的中心映射到 QGraphicsScene 坐标,例如,我可以将一个 Circle 添加到 QPushButton 的中心。
在另一个 post 的帮助下,我找到了 QPushButton 的中心,但它与它在 QGraphicsScene 中的实际位置不符。
我尝试了什么:
获取按钮的QRect,然后获取其中心,最后映射到视图的全局坐标。
获取按钮的 QRect,然后获取其中心并将其映射到 QGraphicsItem。
获取按钮的 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()
给出的结果不一致。
我有一个带有嵌入式 QWidget 的 QGraphicsItem,这个 QWidget 中有一个 QPushButton。 我正在尝试将 QPushButton 的中心映射到 QGraphicsScene 坐标,例如,我可以将一个 Circle 添加到 QPushButton 的中心。
在另一个 post 的帮助下,我找到了 QPushButton 的中心,但它与它在 QGraphicsScene 中的实际位置不符。
我尝试了什么:
获取按钮的QRect,然后获取其中心,最后映射到视图的全局坐标。
获取按钮的 QRect,然后获取其中心并将其映射到 QGraphicsItem。
获取按钮的 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()
给出的结果不一致。