Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要帮助以了解Qt中的SceneBu立是如何工作的_C++_Qt - Fatal编程技术网

C++ 需要帮助以了解Qt中的SceneBu立是如何工作的

C++ 需要帮助以了解Qt中的SceneBu立是如何工作的,c++,qt,C++,Qt,我是新来的。我读过一些教程,但我仍然不明白如何使用 当我运行这个代码时,图像(绿色)显示在中间(可能是默认位置,右边) MyApplication.cpp ui.setupUi(this); ui.graphicsView->setBackgroundBrush(Qt::red); _graphicsScene = make_unique<QGraphicsScene>(this); ui.graphicsView->setScene(_graphicsScen

我是新来的。我读过一些教程,但我仍然不明白如何使用

当我运行这个代码时,图像(绿色)显示在中间(可能是默认位置,右边)

MyApplication.cpp

ui.setupUi(this);    

ui.graphicsView->setBackgroundBrush(Qt::red);
_graphicsScene = make_unique<QGraphicsScene>(this);
ui.graphicsView->setScene(_graphicsScene.get());

_graphicsScene->setBackgroundBrush(Qt::blue);

QImage img("C:\\Users\\user\\Downloads\\img.png");
auto pixImg = QPixmap::fromImage(img);
pixImg = pixImg.scaled(QSize(50, 50), Qt::KeepAspectRatio);

QGraphicsPixmapItem* item = new QGraphicsPixmapItem(pixImg);
_graphicsScene->addPixmap(pixImg);
我想如果我通过
\u entitiesScene->setscenright(0,010100)将
场景设置为
(0,0100100)
图像将显示在左上角,但它只是向上移动了一点

我将
设置为
(50,50100100)
它只是向上和向左移动


场景的简短回顾场景的竖立,项目的边界:

:

这个纯虚函数将项的外部边界定义为矩形;所有绘制必须限制在项目的边界矩形内。QGraphicsView使用此选项确定项目是否需要重新绘制

尽管项目的形状可以是任意的,但边界矩形始终为矩形,并且不受项目变换的影响

此属性保存场景矩形;场景的边界矩形

场景矩形定义了场景的范围。它主要由QGraphicsView用于确定视图的默认可滚动区域,并由QGraphicscene用于管理项目索引

如果未设置或设置为null QRectF,SCENERTISTER()将返回自场景创建以来场景中所有项目的最大边界矩形(即,当项目添加到场景中或在场景中移动时,矩形会增大,但不会缩小)

可以显式设置场景矩形。这将影响视图中的渲染。如果场景被声称不同于所有项目的边界ReCt,视图将分别考虑这一点。 OP中缺少的一部分是,在渲染时考虑了其他内容:

当整个场景可见时,此属性保持视图中场景的对齐

如果整个场景在视图中可见(即,没有可见的滚动条),则视图的对齐方式将决定场景在视图中渲染的位置。例如,如果默认对齐方式为Qt::AlignCenter,则场景将在视图中居中,如果对齐方式为(Qt::AlignLeft | Qt::AlignTop),则场景将在视图的左上角渲染。)

为此,
QGraphicsView
考虑其自身的视图大小和场景矩形,并计算相应的平移以实现所需的对齐。转换用于更新将场景坐标映射到视口坐标的对象

一个小示例来说明这一点(
testqgraphicscenscenstright.cc
):

编译和测试于:

$qmake-qt5 testqgraphicscenscenstright.pro
$make&./testqgraphicscenscenstrupt
g++-c-fno保持内联dllexport-D_GNU_SOURCE-pipe-O2-Wall-W-D_REENTRANT-DQT_NO_DEBUG-DQT_WIDGETS-LIB-DQT_GUI_-LIB-DQT_CORE_-LIB-I.-isystem/usr/include/qt5-isystem/usr/include/qt5/QtWidgets-isystem/usr/include/qt5/QtGui-isystem/usr/include/QtGui-isystem/usr/include/QtGui-isystem/usr/include/QtCore/QtCore-I.-I/QtCore-testtestqgraphicscenscenstright.cc
g++-o testqgraphicscenscenpright.exe testqgraphicscenscenpright.o-lQt5Widgets-lQt5Gui-lQt5Core-lGL-lpthread
Qt版本:5.9.4
新矩形:QRectF(-4.13499,25.560521.8384x10.0007)
场景矩形:QRectF(-5.13499,24.5605 23.8384x12.0007)
场景(0,0)在:QPoint(120,3)处的视图中
场景中左上角的视图:QPointF(-120,-3)
新矩形:QRectF(-46.5428,33.0965 56.7475x44.5152)
场景矩形:QRectF(-47.5428,24.5605 66.2462x54.0512)
场景(0,0)在:q点(141,-17)处的视图中
场景中左上角的视图:QPointF(-141,17)

之后,我通过单击鼠标更改了对齐方式:

场景(0,0)在:QPoint(47,-24)处的视图中
场景中左上角的视图:QPointF(-47,24)

场景的简短回顾场景的竖立,项目的边界:

:

这个纯虚函数将项的外部边界定义为矩形;所有绘制必须限制在项目的边界矩形内。QGraphicsView使用此选项确定项目是否需要重新绘制

尽管项目的形状可以是任意的,但边界矩形始终为矩形,并且不受项目变换的影响

此属性保存场景矩形;场景的边界矩形

场景矩形定义了场景的范围。它主要由QGraphicsView用于确定视图的默认可滚动区域,并由QGraphicscene用于管理项目索引

如果未设置或设置为null QRectF,SCENERTISTER()将返回自场景创建以来场景中所有项目的最大边界矩形(即,当项目添加到场景中或在场景中移动时,矩形会增大,但不会缩小)

可以显式设置场景矩形。这将影响视图中的渲染。如果场景被声称不同于所有项目的边界ReCt,视图将分别考虑这一点。 OP中缺少的一部分是,在渲染时考虑了其他内容:

当整个场景可见时,此属性保持视图中场景的对齐

如果整个场景在视图中可见(即,没有可见的滚动条),则视图的对齐方式将决定场景在视图中渲染的位置。例如,如果默认对齐方式为Qt::AlignCenter,则场景将在视图中居中,如果对齐方式为(Qt::AlignLeft | Qt::AlignTop),则场景将在视图的左上角渲染。)

为此,
QGraphicsView
考虑其自身的视图大小和场景矩形,并计算相应的平移以实现所需的对齐。T
void setupUi(QMainWindow *MyApplicationToolClass)
{
    if (MyApplicationToolClass->objectName().isEmpty())
        MyApplicationToolClass->setObjectName(QString::fromUtf8("MyApplicationToolClass"));
    MyApplicationToolClass->resize(465, 372);
    centralWidget = new QWidget(MyApplicationToolClass);
    centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
    entitiesView = new QGraphicsView(centralWidget);
    entitiesView->setObjectName(QString::fromUtf8("entitiesView"));
    entitiesView->setGeometry(QRect(30, 20, 401, 281));
    MyApplicationToolClass->setCentralWidget(centralWidget);
    menuBar = new QMenuBar(MyApplicationToolClass);
    menuBar->setObjectName(QString::fromUtf8("menuBar"));
    menuBar->setGeometry(QRect(0, 0, 465, 21));
    MyApplicationToolClass->setMenuBar(menuBar);
    mainToolBar = new QToolBar(MyApplicationToolClass);
    mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
    MyApplicationToolClass->addToolBar(Qt::TopToolBarArea, mainToolBar);
    statusBar = new QStatusBar(MyApplicationToolClass);
    statusBar->setObjectName(QString::fromUtf8("statusBar"));
    MyApplicationToolClass->setStatusBar(statusBar);

    retranslateUi(MyApplicationToolClass);

    QMetaObject::connectSlotsByName(MyApplicationToolClass);
} // setupUi
#include <QtWidgets>

// returns a random floating point number in [min, max).
qreal randF(qreal min, qreal max)
{
  return qrand() / (RAND_MAX + 1.0) * (max - min) + min;
}

// returns a random color.
QColor randColor()
{
  return QColor(
    (int)256 * randF(0.0, 1.0),
    (int)256 * randF(0.0, 1.0),
    (int)256 * randF(0.0, 1.0));
}

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QMainWindow qWin;
  qWin.setWindowTitle("QSceneGraph::sceneRect Demo");
  QToolBar qToolbar;
  QAction qCmdAdd("Add Rect");
  qToolbar.addAction(&qCmdAdd);
  QAction qCmdClear("Clear Scene");
  qToolbar.addAction(&qCmdClear);
  qToolbar.addSeparator();
  QWidget qEditAlign;
  QGridLayout qGridAlign; QButtonGroup qBtnGrp;
  QRadioButton qBtnTL, qBtnTC, qBtnTR;
  qGridAlign.addWidget(&qBtnTL, 0, 0);
  qBtnGrp.addButton(&qBtnTL, Qt::AlignLeft | Qt::AlignTop);
  qGridAlign.addWidget(&qBtnTC, 0, 1);
  qBtnGrp.addButton(&qBtnTC, Qt::AlignHCenter | Qt::AlignTop);
  qGridAlign.addWidget(&qBtnTR, 0, 2);
  qBtnGrp.addButton(&qBtnTR, Qt::AlignRight | Qt::AlignTop);
  QRadioButton qBtnCL, qBtnCC, qBtnCR;
  qGridAlign.addWidget(&qBtnCL, 1, 0);
  qBtnGrp.addButton(&qBtnCL, Qt::AlignLeft | Qt::AlignVCenter);
  qGridAlign.addWidget(&qBtnCC, 1, 1);
  qBtnGrp.addButton(&qBtnCC, Qt::AlignHCenter | Qt::AlignVCenter);
  qGridAlign.addWidget(&qBtnCR, 1, 2);
  qBtnGrp.addButton(&qBtnCR, Qt::AlignRight | Qt::AlignVCenter);
  QRadioButton qBtnBL, qBtnBC, qBtnBR;
  qGridAlign.addWidget(&qBtnBL, 2, 0);
  qBtnGrp.addButton(&qBtnBL, Qt::AlignLeft | Qt::AlignBottom);
  qGridAlign.addWidget(&qBtnBC, 2, 1);
  qBtnGrp.addButton(&qBtnBC, Qt::AlignHCenter | Qt::AlignBottom);
  qGridAlign.addWidget(&qBtnBR, 2, 2);
  qBtnGrp.addButton(&qBtnBR, Qt::AlignRight | Qt::AlignBottom);
  qEditAlign.setLayout(&qGridAlign);
  qToolbar.addWidget(&qEditAlign);
  qWin.addToolBar(&qToolbar);
  QGraphicsView qGView;
  QGraphicsScene qGScene;
  qGView.setScene(&qGScene);
  qWin.setCentralWidget(&qGView);
  qWin.show();
  // activate button for default align of qGView
  qBtnGrp.button(qGView.alignment())->setChecked(true);
  // install signal handlers
  QObject::connect(&qCmdAdd, &QAction::triggered,
    [&]() {
      // add rect
      QRectF qRect(
        randF(-50.0, 50.0), randF(-50.0, 50.0),
        randF(10.0, 100.0), randF(10.0, 100.0));
      qGScene.addRect(qRect, QPen(randColor(), 2), randColor());
      // report
      qDebug() << "new rect:" << qRect;
      qDebug() << "scene rect:" << qGScene.sceneRect();
      qDebug() << "scene (0, 0) in view at:"
        << qGView.mapFromScene(QPointF(0.0, 0.0));
      qDebug() << "top left view corner in scene at:"
        << qGView.mapToScene(QPoint(0, 0));
    });
  QObject::connect(&qCmdClear, &QAction::triggered,
    [&]() {
      // clear scene
      qGScene.clear();
      // reset sceneRect
      qGScene.setSceneRect(QRect());
    });
  QObject::connect(&qBtnGrp,
    (void(QButtonGroup::*)(int, bool))&QButtonGroup::buttonToggled,
    [&](int id, bool checked) {
      if (checked) qGView.setAlignment((Qt::Alignment)id);
    });
  // run time loop
  return app.exec();
}