Qt:如何调整 QGraphicsItem 以动态改变大小

Posted

技术标签:

【中文标题】Qt:如何调整 QGraphicsItem 以动态改变大小【英文标题】:Qt: How to adjust QGraphicsItem to dynamicaly change size 【发布时间】:2017-11-16 21:43:12 【问题描述】:

我有这个问题好几天了。我已经创建了 QGraphicsItem,我想将它的大小拉伸/调整为我的 QGraphicsView 的大小。我使用的是 paint() 方法,但在更新时遇到了问题。现在我使用了 boundingRect() 但它使用固定大小。当我设置的尺寸太大时,它会扩展我的场景并出现滚动条。有没有办法将项目的大小调整为视图的大小?

编辑:我只想调整对象的高度。

这里有一些代码:

我的项目的标题:

#ifndef POINTER_H
#define POINTER_H
#include <QObject>
#include <QColor>
#include <QRect>
#include <QGraphicsLineItem>
#include <QPainter>
#include <QGraphicsSceneMouseEvent>

class Pointer : public QGraphicsLineItem

public:
    Pointer();
    void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget);
    QRectF boundingRect() const;
    int position;
    void changePosition(int x);

;

#endif // TRACKPOINTER_H

我的项目的实现:

#include "pointer.h"

Pointer::Pointer()

    //this->setFlag(QGraphicsLineItem::ItemIsMovable);
    //setFlag(QGraphicsLineItem::ItemIsFocusable);
    //setFocus();



void Pointer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)


    QPen pen(Qt::red);
    painter->setPen(pen);
    painter->setBrush(QColor(77,77,77));
    painter->drawLine(0,0,0,2000);



QRectF Pointer::boundingRect() const

    return QRectF(0,0,2,600);


void Pointer::changePosition(int x)

    //position = x;
    setPos(x,0);
    update();

还有我的窗口:

Window::Window(Timers *timer, TrackPointer *tp)

Timeline = new QGraphicsScene(this);
TimelineView = new QGraphicsView(Timeline);
TimelineView->setAlignment(Qt::AlignTop|Qt::AlignLeft);

QVBoxLayout *timeLineLayout = new QVBoxLayout;
timeLineLayout->addWidget(TimelineView);

Pointer *pointer = new Pointer;
Timeline->addItem(pointer);

我的场景也有问题:当我的对象移动到某个地方时 - 它会扩展场景。后来当我把我的对象带回它的起始位置时,场景仍然被扩展,我有滚动条来滚动我的场景周围的视图。有没有办法使用我的对象来减小场景大小?

【问题讨论】:

你可能对QGraphicsView::resizeEvent感兴趣。 我在 QgraphicsItem 类中创建了函数 resizeEvent(QResizeEvent *event),但它不起作用。我猜我做错了什么。 你应该使用QGraphicsView的resize事件而不是QGraphicsItem的resize事件。 为此,我必须创建继承自 QGraphicsView 的类并获得 resize 事件?然后创建我的自定义 QGraphicsView 类的对象?有没有办法在不创建自定义类的情况下做到这一点?正如您在上面的代码中看到的那样,我使用它的标准类创建了 QGraphicsView:''TimelineView = new QGraphicsView(Timeline);'' 嗯,继承是我的首选方式。您可能想改用事件过滤器。关键是,无论哪种情况,您都可以捕捉到视图大小的变化,并相应地调整场景中项目的大小。 【参考方案1】:

承诺的示例如下所示:

MainWindow.h

#include <QMainWindow>

class QGraphicsView;
class QGraphicsRectItem;

class MainWindow : public QMainWindow

    Q_OBJECT    
public:
    explicit MainWindow(QWidget *parent = nullptr);

    bool eventFilter(QObject *watched, QEvent *event) override;

private:
    QGraphicsView *m_view;
    QGraphicsRectItem *m_item;
;

MainWindow.cpp

#include "MainWindow.h"
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QEvent>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    m_view(new QGraphicsView(this)),
    m_item(new QGraphicsRectItem(0, 0, 1, 1))

    m_view->setScene(new QGraphicsScene());
    m_view->setFrameStyle(QFrame::NoFrame);
    m_view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
    m_view->setSceneRect(0, 0, 1, 1);
    m_view->installEventFilter(this);
    m_view->scene()->addItem(m_item);

    setCentralWidget(m_view);
    resize(600, 400);


bool MainWindow::eventFilter(QObject *watched, QEvent *event)

    if ((watched == m_view) && (event->type() == QEvent::Resize))
        m_item->setRect(m_view->viewport()->rect().adjusted(5, 5, -5, -5));

    return QMainWindow::eventFilter(watched, event);

【讨论】:

【参考方案2】:

查看:QGraphicsView::fitInView

http://doc.qt.io/qt-4.8/qgraphicsview.html#fitInView

QPixmap *pixMap= new QPixmap();;
QGraphicsScene *scene=new QGraphicsScene();;
pixMap->loadFromData(jpegData);
scene->clear();
pixMapItem = scene->addPixmap(*pixMap);
ui->graphicsView->fitInView(scene->sceneRect(), Qt::KeepAspectRatio);
ui->graphicsView->show();
ui->graphicsView->viewport()->update();

【讨论】:

fitInView 使用它的坐标系统缩放项目,所以如果我以后想将项目移动 5 像素,它会超出我想要的范围

以上是关于Qt:如何调整 QGraphicsItem 以动态改变大小的主要内容,如果未能解决你的问题,请参考以下文章

Qt 视图框架QGraphicsItem

如何在 QGraphicsItem 上接收手势事件?

用鼠标调整 QGraphicsItem 的大小

QT:QGraphicsView QGraphicsScene QGraphicsItem理解

Qt:强制 QGraphicsItem 更新

QT 4.5 - 更改 QGraphicsItem 的选择框