gpt4 book ai didi

c++ - 如何根据 QGraphicSscene 缩放/调整 QGraphicsWidget 的大小?

转载 作者:行者123 更新时间:2023-11-30 04:57:20 31 4
gpt4 key购买 nike

我希望我的 QGraphicsWidget 根据场景的大小来缩放它的大小。我目前拥有的 QGraphicsWidget 是固定大小,具体取决于 sizeHint 的返回值(QGraphicsWidget 始终为 200 x 200)。下面附上了最小的例子:

主窗口.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

主窗口.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;
}

Window small

enter image description here

如有任何帮助,我们将不胜感激。

最佳答案

背景

您的QGraphicsWidget 必须注意两件事:

  1. 添加到场景中时

为了做到这一点,您必须重新实现 QGraphicsWidget::itemChange 并寻找类型的更改 QGraphicsItem::ItemSceneHasChanged

  1. 当这个场景的大小发生变化时

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

解决方案

根据给定的解释,我的解决方案如下:

RectangleWidget.h 之后 QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const override; 添加:

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);
}

最后,在 MainWindow.cpp m_scene->addItem(m_rectangleWidget); 之后设置 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com