2014-10-10 66 views
2

我研究QGraphics框架並希望創建自定義大小的小部件。如何在QGraphicsScene上創建可調整大小的cusom小部件

比如我創建了一個代理窗口小部件的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); 

的Widget看起來不錯,但我不能找出如何添加調整其大小的能力。 我在Qt範例和谷歌搜索,但找不到任何例子。

+0

真的['的Proxy-> setGeometry(newRect)'不工作(http://qt-project.org/doc/qt-4.8/qgraphicsproxywidget.html#setGeometry)?我必須嘗試一下。 – 2014-10-10 15:21:14

回答

2

甲GraphicsItem的大小,其中QGraphicsProxyWidget導出,是由它的邊界矩形限定。我預計小部件的大小將定義其代理小部件的初始大小,因此您可以先嚐試更改實際的小部件。

爲了更改QGraphicsItem的大小,您需要從QGraphicsProxyWidget派生並覆蓋它的boundingRect()函數。

然後,你可以創建一個調整大小功能更改返回的矩形,但要確保你先打電話prepareGeometryChange

如果從QGraphicsProxyWidget繼承並改變其尺寸這樣,封閉小部件可能會或可能不會進行調整,這取決於它的實現。

我建議你先嚐試先調整封閉小部件的大小。

另請注意,如果您從QGraphicsProxyWidget派生,還存在QGraphicsItems的setScale函數,該函數也可能是此處的一個選項,並且可以在繪製函數中縮放QPainter。

0

你應該有你的QGraphicsView例如可調整大小,因此您的場景內容將在調整過的反應。 在這裏它的工作示例(您應在MainWindows形式添加的QGraphicsView元素):

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

然而,這並不影響內部場景中的小部件的大小。要達到這一點,請參閱Merlin's answer

同樣在這裏它是例如具有使用來自here獲得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); 
} 
相關問題