首页 > 解决方案 > 在 QGraphicsItem QT 中设置 XY 坐标

问题描述

使用 Qapplication 和 QGraphicsItem Library 来确定对象的坐标,通常使用setPossetPos(mapToParent(yvelocity,-xvelocity))。这些命令的问题是它们确定了对象移动的“速度”(不是它们的 XY 坐标!)。那么通过什么命令我可以提供 X 和 Y 输入并且对象会转到这些坐标?提前致谢。

标签: qtqgraphicssceneqgraphicsitemqapplication

解决方案


在我的评论中,我给出了建议:

类似的东西setPos(pos() + mapToParent(yvelocity,-xvelocity))。虽然pos()返回QPointF,但您可以应用operator+. - 有合适的过载。

在三思而后行时,我纠结于mapToParent()哪个对我来说是错误的。

根据 OP,速度描述了一个方向。专用于将mapToParent()本地位置转换为父坐标系中的位置

QPointF QGraphicsItem::mapToParent(const QPointF &point) const

将位于此项坐标系中的点point映射到其父坐标系,并返回映射后的坐标。如果项目没有父项,点将被映射到场景的坐标系。

因此,更好的建议可能是:

setPos(pos() + QPointF(yvelocity,-xvelocity));

我制作了一个MCVE testQGraphicsItemSetPos.cc来证明这一点:

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup data
  QGraphicsScene qGScene;
  QImage qImg("smiley.png");
  QGraphicsPixmapItem qGItemImg(QPixmap::fromImage(qImg));
  qGScene.addItem(&qGItemImg);
  const qreal v = 2.0;
  qreal xVel = 0.0, yVel = 0.0;
  // setup GUI
  QWidget qWinMain;
  qWinMain.resize(320, 200);
  qWinMain.setWindowTitle("QGraphicsView - Move Item");
  QVBoxLayout qVBox;
  QGraphicsView qGView;
  qGView.setScene(&qGScene);
  qVBox.addWidget(&qGView, 1);
  qWinMain.setLayout(&qVBox);
  qWinMain.show();
  // timer for periodic update
  using namespace std::chrono_literals;
  QTime qTime(0, 0);
  QTimer qTimerAnim;
  qTimerAnim.setInterval(50ms);
  // install signal handlers
  QObject::connect(&qTimerAnim, &QTimer::timeout,
    [&]() {
      // change velocity xVel and yVel alternating in range [-1, 1]
      const qreal t = 0.001 * qTime.elapsed(); // t in seconds
      xVel = v * std::sin(t); yVel = v * std::cos(t);
      // apply current velocity to move item
      qGItemImg.setPos(qGItemImg.pos() + QPointF(xVel, yVel));
    });
  // runtime loop
  qTimerAnim.start();
  return app.exec();
}

和一个CMakeLists.txt

project(QGraphicsItemSetPos)

cmake_minimum_required(VERSION 3.10.0)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(Qt5Widgets CONFIG REQUIRED)

include_directories("${CMAKE_SOURCE_DIR}")

add_executable(testQGraphicsItemSetPos testQGraphicsItemSetPos.cc)

target_link_libraries(testQGraphicsItemSetPos Qt5::Widgets)

我用它在 VS2017 中构建并启动了示例:

testQGraphicsItemSetPos.exe 的快照(动画)


推荐阅读