我学习QGraphics框架,并希望创建自定义的可调整大小的小部件。
例如,我用QTextEdit创建了一个代理小部件
QGraphicsLinearLayout* l = new QGraphicsLinearLayout;
QGraphicsProxyWidget* proxy = new QGraphicsProxyWidget;
proxy->setWidget( new QTextEdit );
proxy->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
l->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
l->addItem( proxy );
QGraphicsWidget* w = new QGraphicsWidget;
w->setLayout( l );
w->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
w->setFlag( QGraphicsItem::ItemIsMovable );
scene->addItem( w ); 小部件看起来很好,但我不知道如何添加调整大小的功能。我在Qt示例和google中搜索,但是找不到任何例子。
发布于 2014-10-10 09:46:22
QGraphicsProxyWidget派生的GraphicsItem大小由其边界矩形定义。我希望小部件的大小将定义其代理小部件的初始大小,因此您可以先尝试更改实际的小部件。
为了更改QGraphicsItem的大小,您需要从QGraphicsProxyWidget派生并重写它的boundingRect()函数。
然后,您将能够创建一个调整大小的函数来更改返回的矩形,但要确保首先调用prepareGeometryChange。
如果您确实继承了QGraphicsProxyWidget并以这种方式更改了它的大小,那么封闭的小部件可能会或不会被调整大小,这取决于它的实现。
我建议您首先尝试调整封装小部件的大小。
还请注意,如果您从setScale函数派生,那么QGraphicsItems存在一个QPainter函数,它也可能是这里的一个选项,也可以缩放QPainter。
发布于 2014-10-10 09:45:48
您应该使您的QGraphicsView实例可以调整大小,这样您的场景内容也会在调整大小时做出反应。这里是一个工作示例(您应该在您的QGraphicsView表单中添加MainWindows元素):
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTextEdit>
#include <QPushButton>
#include <QGraphicsLinearLayout>
#include <QGraphicsProxyWidget>
#include <QGraphicsScene>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QGraphicsScene* scene = new QGraphicsScene(this);
QGraphicsWidget *textEdit = scene->addWidget(new QTextEdit);
QGraphicsWidget *pushButton = scene->addWidget(new QPushButton);
QGraphicsLinearLayout *layout = new QGraphicsLinearLayout;
layout->addItem(textEdit);
layout->addItem(pushButton);
QGraphicsWidget *form = new QGraphicsWidget;
form->setLayout(layout);
scene->addItem(form);
ui->graphicsView->setScene(scene);
setCentralWidget(ui->graphicsView);
}
MainWindow::~MainWindow()
{
delete ui;
}但是,这并不影响场景中小部件的大小大小。要实现这一点,请参见梅林的回答。
这里也给出了使用从scaling获得的这里的工作解的例子
void MyGraphicsView::resizeEvent(QResizeEvent* event)
{
QGraphicsView::resizeEvent(event);
QSize viewportSize = this->viewport().size();
QSize imageGridSize = ...; //size of all images (bounding rect)
qreal factor = viewportSize.width() / imageGridSize.width();
if( viewportSize.height() < (imageGridSize * factor).height() )
factor *= viewSize.height() / (imageSize * factor).height();
this->resetTransform();
QTransform transform = this->transform();
transform.scale(factor, factor);
this->setTransform(transform);
}https://stackoverflow.com/questions/26296092
复制相似问题