QGraphicsView::QGraphicsView(QWidget *parent = nullptr)QGraphicsView::QGraphicsView(QGraphicsScene *scene, QWidget *parent = nullptr)
parent: 父控件,用于管理 QGraphicsView 的内存。
scene: 要显示的场景。
scene: 获取或设置 QGraphicsView 显示的场景。
matrix: 获取或设置场景的变换矩阵。
interactive: 获取或设置视图是否允许用户交互(如缩放、滚动)。
setScene(QGraphicsScene *scene): 设置 QGraphicsView 要显示的场景。
centerOn(const QPointF &point): 将视图中心移动到指定的点。
scale(double factor): 对视图进行缩放。
rotate(int degrees): 旋转视图。
translate(int dx, int dy): 平移视图。
sceneChanged(QGraphicsScene *scene): 当场景改变时发出的信号。
sigStateChanged(QGraphicsView::ViewportUpdateMode mode): 当视图状态改变时发出的信号。
void onSceneChanged(QGraphicsScene *scene): 通常用户自定义的槽函数,用于响应场景改变的事件。


QGraphicsView::mapToScene(): 将视图坐标转换为场景坐标。
QGraphicsView::mapFromScene(): 将场景坐标转换为视图坐标。
QGraphicsItem::mapFromScene(): 将场景坐标转换为图元坐标。
QGraphicsItem::mapToScene(): 将图元坐标转换为场景坐标。
QGraphicsItem::mapToParent(): 将子图元坐标转换为父图元坐标。
QGraphicsItem::mapFromParent(): 将父图元坐标转换为子图元坐标。
QGraphicsItem::mapToItem(): 将当前图元坐标转换为另一个图元的坐标。
QGraphicsItem::mapFromItem(): 将另一个图元的坐标转换为当前图元的坐标。
class MainWindow : public QWidget {Q_OBJECTpublic:MainWindow() {QGraphicsScene *scene = new QGraphicsScene(this);scene->addRect(0, 0, 100, 100, QPen(), QBrush(Qt::blue));QGraphicsView *view = new QGraphicsView(scene, this);view->setRenderHint(QPainter::Antialiasing);view->setInteractive(true);QVBoxLayout *layout = new QVBoxLayout(this);layout->addWidget(view);}};int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec();}
class DraggableRect : public QGraphicsRectItem {public:DraggableRect(QGraphicsItem *parent = nullptr) : QGraphicsRectItem(0, 0, 100, 100, QPen(), QBrush(Qt::blue)) {setPos(QPointF(50, 50)); // 初始位置}protected:void mousePressEvent(QGraphicsSceneMouseEvent *event) override {dragPosition = event->scenePos(); // 记录场景坐标系中的位置QGraphicsRectItem::mousePressEvent(event);}void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override {QPointF delta = event->scenePos() - dragPosition; // 计算移动的距离setPos(mapToParent(delta + pos())); // 更新位置QGraphicsRectItem::mouseMoveEvent(event);}private:QPointF dragPosition;};int main(int argc, char *argv[]) {QApplication a(argc, argv);QGraphicsScene scene;scene.setSceneRect(0, 0, 800, 600); // 设置场景大小DraggableRect *rect = new DraggableRect(); // 创建可拖动的矩形scene.addItem(rect);QGraphicsView view(&scene);view.setRenderHint(QPainter::Antialiasing);view.show();return a.exec();}
在 mousePressEvent 中,我们记录了鼠标按下时的场景坐标系中的位置。
在 mouseMoveEvent 中,我们计算了鼠标移动的距离,并使用 mapToParent 方法将这个距离转换为父坐标系中的位移,然后更新矩形的位置。

想了解更多
赶紧扫码关注
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/48925.html