我希望我的QGraphicsWidget可以根据场景的大小缩放其大小。我目前使用的QGraphicsWidget的大小是固定的,具体取决于sizeHint的返回值(QGraphicsWidget始终为200 x 200)。以下是最小的示例:

MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QGraphicsScene>
#include <QGraphicsView>

#include "RectangleWidget.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
    QGraphicsScene * m_scene;
    QGraphicsView * m_view;
    RectangleWidget * m_rectangleWidget;
};

#endif // MAINWINDOW_H

MainWindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    m_scene = new QGraphicsScene(this);

    m_view = new QGraphicsView(m_scene, this);
    m_view->setAlignment(Qt::AlignLeft | Qt::AlignTop);

    m_rectangleWidget = new RectangleWidget();

    m_scene->addItem(m_rectangleWidget);

    setCentralWidget(m_view);
}

MainWindow::~MainWindow()
{
    delete ui;
}

RectangleWidget.h:
#ifndef RECTANGLEWIDGET_H
#define RECTANGLEWIDGET_H

#include <QGraphicsLinearLayout>
#include <QGraphicsWidget>


class RectangleWidget: public QGraphicsWidget
{
public:
    RectangleWidget(QGraphicsWidget* parent = nullptr);

    QRectF boundingRect() const override;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;

    void setGeometry(const QRectF &geom) override;
    QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override;
};

#endif // RECTANGLEWIDGET_H

RectangleWidget.cpp:
#include "rectanglewidget.h"
#include <QPainter>

RectangleWidget::RectangleWidget(QGraphicsWidget* parent)
{

}

void RectangleWidget::paint(QPainter *painter,
    const QStyleOptionGraphicsItem *option, QWidget *widget /*= 0*/)
{
    Q_UNUSED(widget);
    Q_UNUSED(option);

    //Draw border
    painter->drawRoundedRect(boundingRect(), 0.0, 0.0);

}

QRectF RectangleWidget::boundingRect() const
{

    return QRectF(QPointF(0,0), geometry().size());
}

void RectangleWidget::setGeometry(const QRectF &geom)
{
    prepareGeometryChange();
    QGraphicsLayoutItem::setGeometry(geom);
    setPos(geom.topLeft());
}

QSizeF RectangleWidget::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
    switch (which) {
    case Qt::MinimumSize:
        return QSizeF(200, 200);

    default:
        break;
    }
    return constraint;
}

c&#43;&#43; - 如何基于QGraphicSscene缩放QGraphicsWidget?-LMLPHP

c&#43;&#43; - 如何基于QGraphicSscene缩放QGraphicsWidget?-LMLPHP

任何帮助,将不胜感激。

最佳答案

背景
您的QGraphicsWidget必须注意两件事:

  • 添加到场景中时

  • 为此,您必须重新实现QGraphicsWidget::itemChange并查找QGraphicsItem::ItemSceneHasChanged类型的更改。
  • 当此场景的大小更改时

  • 这可以通过将插槽或lambda函数连接到QGraphicsScene::sceneRectChanged信号来完成。

    根据给定的解释,我的解决方案如下:
    QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override;之后的 RectangleWidget.h 中添加:
    protected:
        QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
    
    private:
        QSize m_rectSize;
    
    RectangleWidget.cpp 中,将return QSizeF(200, 200);更改为return m_rectSize;并在末尾添加:
    QVariant RectangleWidget::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
    {
        if (change == ItemSceneHasChanged) {
            connect(value.value<QGraphicsScene *>(), &QGraphicsScene::sceneRectChanged, [this](const QRectF &rect){
                m_rectSize.setWidth(rect.size().width());
                m_rectSize.setHeight(rect.size().height());
            });
        }
    
        return QGraphicsWidget::itemChange(change, value);
    }
    
    最后,在m_scene->addItem(m_rectangleWidget);之后的 MainWindow.cpp 中,将sceneRect设置如下:
    m_scene->setSceneRect(0, 0, 100, 400);
    
    注意:矩形将响应场景而不是 View 的更改。因此,如果您调整窗口的大小,则矩形将不会被调整大小。
    调整
    这将使矩形与场景完全相同。如果您想要不同的比率,请说0.5,而不是m_rectSize.setWidth(rect.size().width());分别写m_rectSize.setWidth(rect.size().width() / 2);m_rectSize.setHeight(rect.size().height() / 2);

    关于c++ - 如何基于QGraphicSscene缩放QGraphicsWidget?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52061702/

    10-09 00:20