首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QGraphicsScene上创建可调整大小的cusom小部件

如何在QGraphicsScene上创建可调整大小的cusom小部件
EN

Stack Overflow用户
提问于 2014-10-10 09:25:46
回答 2查看 2.6K关注 0票数 5

我学习QGraphics框架,并希望创建自定义的可调整大小的小部件。

例如,我用QTextEdit创建了一个代理小部件

代码语言:javascript
复制
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中搜索,但是找不到任何例子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-10 09:46:22

QGraphicsProxyWidget派生的GraphicsItem大小由其边界矩形定义。我希望小部件的大小将定义其代理小部件的初始大小,因此您可以先尝试更改实际的小部件。

为了更改QGraphicsItem的大小,您需要从QGraphicsProxyWidget派生并重写它的boundingRect()函数。

然后,您将能够创建一个调整大小的函数来更改返回的矩形,但要确保首先调用prepareGeometryChange

如果您确实继承了QGraphicsProxyWidget并以这种方式更改了它的大小,那么封闭的小部件可能会或不会被调整大小,这取决于它的实现。

我建议您首先尝试调整封装小部件的大小。

还请注意,如果您从setScale函数派生,那么QGraphicsItems存在一个QPainter函数,它也可能是这里的一个选项,也可以缩放QPainter。

票数 2
EN

Stack Overflow用户

发布于 2014-10-10 09:45:48

您应该使您的QGraphicsView实例可以调整大小,这样您的场景内容也会在调整大小时做出反应。这里是一个工作示例(您应该在您的QGraphicsView表单中添加MainWindows元素):

代码语言:javascript
复制
#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获得的这里的工作解的例子

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26296092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档