qt - 在 QGraphicsItem QT 中设置 XY 坐标
问题描述
使用 Qapplication 和 QGraphicsItem Library 来确定对象的坐标,通常使用setPos
和setPos(mapToParent(yvelocity,-xvelocity))
。这些命令的问题是它们确定了对象移动的“速度”(不是它们的 XY 坐标!)。那么通过什么命令我可以提供 X 和 Y 输入并且对象会转到这些坐标?提前致谢。
解决方案
在我的评论中,我给出了建议:
类似的东西
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 中构建并启动了示例:
推荐阅读
- rest - 对文件和 Json 进行 HTTP 响应
- node.js - 如何让 Node.Js 允许我为客户端证书提供智能卡/cac
- scala - Scala,如何使用函数式编程在复杂序列之间进行一种连接操作?
- java - 添加新元素时,树查看器刷新需要很长时间
- google-apps-script - 在谷歌表格中格式化 JSON 数据导入
- javascript - 有没有办法根据字符串长度打印显示更多/显示更少按钮,并且字符串存在于 React Js 的数组中?
- php - 使用 postgres 提取 Json
- apache-spark - PySpark / Kafka - org.apache.spark.sql.kafka010.KafkaSourceProvider 无法实例化
- xcode - 无法在 Xcode 中使用模拟器方案存档,但可以在命令行中使用 xcodebuild 进行存档。为什么?
- reactjs - 异步函数内部未定义状态(无法读取未定义的属性“过滤器”)-反应js