2016-02-23 80 views
0

我有一個QGraphicsView子類,在QWidget的內部持有QGraphicsScene子類。將QGraphicsView左上移動到QGraphicsScene中的某個點手動

QGraphicsScene有一個實際的繪製矩形,頂部讓角落在(0,0)(所以場景確實有一個QRectF(-x,-y,w,h)的值與問題無關)。

在啓動時,實際上在窗口小部件的showEvent中,我將場景的大小設置爲適合自定義大小的矩形。這也是它的中心。

我想要的是在開始時將場景的(0,0)點與視圖的左上角相匹配。

與其他題目相同的問題不同,我實際上需要移動視圖,而不是場景中的項目。

圖片1:實際開始,像2:所需

actualdesired

我想:

void MyWidget::showEvent(QShowEvent *event) 
{ 
    static bool startUp = true; 
    if(startUp) 
    { 
     QSizeF sz = m_scene->getActualSize(); 
     ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio); 

     QPointF zero = ui->graphicsView->mapFromScene(QPointF(0,0)); 
     ui->graphicsView->translate(-zero.x(), -zero.y()); // or positive 

     startUp = false; 
    } 
    QWidget::showEvent(event); 
} 

注:我用的是fitInView獲得所需的縮放 - 它也帶來所需的矩形焦點 - 但集中在視圖中。

我也試過

void GraphicsView::alignToZero() 
{ 
    QPointF zero = this->mapFromScene(QPointF(0,0)); 
    this->scrollContentsBy(-zero.x(), -zero.y()); 
} 

void MyWidget::showEvent(QShowEvent *event) 
{ 
    static bool startUp = true; 
    if(startUp) 
    { 
     QSizeF sz = m_scene->getActualSize(); 
     ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio); 

     ui->graphicsView->alignToZero(); 

     startUp = false; 
    } 
    QWidget::showEvent(event); 
} 

仍然沒有結果。

也試過

void MyWidget::showEvent(QShowEvent *event) 
{ 
    static bool startUp = true; 
    if(startUp) 
    { 
     QSizeF sz = m_scene->getActualSize(); 
     ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio); 

     QPointF zero = ui->graphicsView->mapFromScene(QPointF(0,0)); 
     //ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop); 
     ui->graphicsView->horizontalScrollBar()->setValue(zero.x()); 
     ui->graphicsView->verticalScrollBar()->setValue(zero.y()); 

     startUp = false; 
    } 
    QWidget::showEvent(event); 
} 

此,有或沒有對齊設置(我認爲可能有其他地方的不良影響),移動視圖...太遠。

回答

0

雖然必須有一個更好的辦法......我想出了一個辦法讓我的0做fitInView兩次一致:

void MyWidget::showEvent(QShowEvent *event) 
{ 
    static bool startUp = true; 
    if(startUp) 
    { 
     QSizeF sz = m_scene->getActualSize(); 
     // First I do a normal `fitInView` that centers the rectangle 
     ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio); 

     // Then, knowing the shift, I fit it again adding twice the shift to the size. 
     QPointF zero = ui->graphicsView->mapToScene(QPoint(0,0)); 
     ui->graphicsView->fitInView(QRectF(0, 0, sz.width() - 2 * zero.x(), sz.height() - 2 * zero.y()), Qt::KeepAspectRatio); 

     startUp = false; 
    } 
    QWidget::showEvent(event); 
} 
2

如果我正確理解你的問題,以達到預期的效果,你可以使用方法

的QGraphicsView ::參考setAlignment(QT ::對齊排列):

ui->graphicsView->setAlignment(Qt::AlignTop | Qt::AlignLeft); 

這是在你的代碼註釋。 使用這些參數的這種方法將視圖左上對齊,您不必移動或適合任何東西。