c++ - QGraphicsView/Scene - 项目绘制距离鼠标点击 2 倍
问题描述
我一直在尝试使用图形视图框架来绘制我单击的节点。但是,我无法获得正确的位置。
所以这是 mainwindow.cpp 的代码:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
scene = new GraphScene(this);
ui->setupUi(this);
ui->graphicsView->setScene(scene);
ui->graphicsView->setSceneRect(ui->graphicsView->rect());
ui->graphicsView->setFrameStyle(0);
ui->graphicsView->show();
}
自定义场景mousePressEvent:
void GraphScene::mousePressEvent(QGraphicsSceneMouseEvent *event){
if (!this->itemAt(event->scenePos(), QTransform())){
this->addItem(new NodeItem(event->scenePos()));
this->update();
}
}
和节点项:
NodeItem::NodeItem(QPointF position) {
this->setPos(position) ;
}
void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
painter->drawEllipse(pos(), 30.0, 30.0);
}
QRectF NodeItem::boundingRect() const{
return QRectF(pos(), QSizeF(30,30));
}
我尽力修复它,但我已经坚持了一段时间并且无法修复它。我会很感激任何帮助。
解决方案
QGraphicsView
并QGraphicsScene
处理不同的坐标系,在这种情况下,boundingRect()
他们paint()
必须在相对于项目的局部坐标中执行方法,并且您不应该使用该pos()
方法,因为它指的是相对于场景的坐标。
void NodeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/){
painter->drawEllipse(boundingRect());
}
QRectF NodeItem::boundingRect() const{
return QRectF(QPointF(-15, -15), QSizeF(30,30));
}
推荐阅读
- typescript - 导出异步成员的问题
- elasticsearch - 在 Elasticsearch 中搜索 Zulu 日期格式的文档
- javascript - 如何设置地图项的样式以在 justify-content-around 中显示?
- java - 使用 Postgres 实现 Spring + Apache Flink 项目
- spring - 配置中的默认管理员用户和数据库中的其他用户
- java - 修复此错误 Bukkit 的正确方法是什么?
- java - 如何从广播接收器中的 dbhelper 调用方法
- java - 当用户在几天后再次拒绝更新时,如何显示应用内更新对话框?
- laravel - 使用 TailwindCSS 配置后,npm run watch 无法在 Ubuntu 上运行
- c++ - 为什么在这种多线程环境中添加延迟会提高数据吞吐量?