1

QVerticalLayout 内の QHorizo​​ntalLayout 内に QGraphicsView 要素があるため、画面のサイズが変更されると、graphicsview 要素も一緒にサイズ変更されます。Qt Creator では、この構造に追加する要素には、ジオメトリ データが添付されていません。Qt Creator ではグレー表示され、動的に更新されます。

ただし、c++ を介してこの graphicsView 要素のサイズを取得しようとすると、画面に表示される実際の幅と高さではなく、デフォルト値 (0,0 100x30) が返されます。この QGraphicsView 要素から正しい位置、幅、高さを取得するにはどうすればよいですか?

この問題を再現するための最小限のプログラム

次の変更を加えたデフォルトの qt ウィジェット:

メインウィンドウ.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>

メインウィンドウ.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;
}

プログラムのスクリーンショット。

2 つの小さな長方形は、シーンの左上と右下で、QGraphicsView の位置とサイズに設定されています。QGraphicsView よりも小さいシーンが中央に配置されるため、シーンは中央に表示されます。これは、アプリケーションが QGraphicsView の実際のサイズを何らかの形で認識していることを意味します。これらの長方形の間の領域は 100 x 30 ピクセルで、これがデフォルト値のようです。

このプログラムの実行中のウィンドウを示すスクリーンショット

4

1 に答える 1

1

QResizeEventQWidget が非表示の場合、表示されるまで受け取りません。 https://qt-project.org/doc/qt-5/qwidget.html#size-propを参照してください。したがって、コンストラクターで位置またはサイズを取得しようとすると、デフォルト値が取得されます。

MainWindowで graphicsView のジオメトリを監視できvoid resizeEvent(QResizeEvent *)ます。

于 2014-11-14T03:07:15.473 に答える