首页 文章

如何在动态窗口小部件中获取QGraphicsView的正确位置,宽度和高度

提问于
浏览
1

我在QVerticalLayout内的QHorizontalLayout中有一个QGraphicsView元素,因此如果调整屏幕大小,则会使用它调整graphicsview元素的大小 . 在Qt Creator中,您添加到此构造中的任何元素都不会附加任何几何数据 . 在Qt Creator中,它会变灰并动态更新 .

当我尝试通过c获取此graphicsView元素的大小时,它将返回默认值(0,0 100x30),而不是实际的宽度和高度,如它在屏幕上的显示方式 . 如何从这个QGraphicsView元素中获得正确的位置,宽度和高度?

Minimal program to reproduce this problem

默认的qt小部件,包含以下更改:

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>400</width>
    <height>300</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QVBoxLayout" name="verticalLayout_2">
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout_2">
      <item>
       <widget class="QGraphicsView" name="graphicsView"/>
      </item>
     </layout>
    </item>
   </layout>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>
#include <QGraphicsScene>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //Expected output: 1 1 380 280
    //Actual output:   0 0 100 30
    qDebug() << ui->graphicsView->x() << ui->graphicsView->y()
             << ui->graphicsView->width() << ui->graphicsView->height();

    //Expected output: QRectF(1,1 380x280)
    //Actual output:   QRectF(0,0 100x30)
    qDebug() << ui->graphicsView->rect();

    //We need a scene to draw things
    QGraphicsScene *scene = new QGraphicsScene( parent );
    ui->graphicsView->setScene(scene);

    scene->setSceneRect(ui->graphicsView->x(), ui->graphicsView->y(),
                        ui->graphicsView->width(), ui->graphicsView->height());

    //Box in the top left and bottom right so we have a visual clue
    scene->addRect(0,0,2,2,QPen(),QBrush());
    scene->addRect(scene->width(),scene->height(),2,2,QPen(),QBrush());

}

MainWindow::~MainWindow()
{
    delete ui;
}

Screenshot of the program.

两个小矩形是场景的左上角和右下角,设置为QGraphicsView的位置和大小 . 场景显示在中间,因为比它们所在的QGraphicsView小的场景居中,这意味着应用程序以某种方式知道QGraphicsView的实际大小 . 这些矩形之间的区域是100 x 30像素,这似乎是默认值 .

Screenshot showing the window while running this program

1 回答

  • 1

    如果隐藏了QWidget,则在显示之前不会收到 QResizeEvent ,请参阅https://qt-project.org/doc/qt-5/qwidget.html#size-prop . 因此,当您尝试获取构造函数中的位置或大小时,您将获得默认值 .

    您可以在MainWindow的 void resizeEvent(QResizeEvent *) 中监视graphicsView的几何 .

相关问题