0

进行搜索这是我找到并放置在“main.cpp”中的内容:

QGraphicsScene scene;
QGraphicsView view(&scene);

但我需要类似以下内容并放置在 "mainwindow.cpp" 中:

QGraphicsScene scene;
QGraphicsView *view = new QGraphicsView();
view->addScene(&scene); //need something like this

这主要工作并显示“黄色”背景。但是,当我在 mainwindow.cpp 中使用 setScene 进行更改时,不会出现黄色背景。

主文件

 QGraphicsScene scene;
 QGraphicsView view(&scene);

 view.setRenderHint(QPainter::Antialiasing);
 view.setBackgroundBrush(Qt::yellow);
 view.setCacheMode(QGraphicsView::CacheBackground);
 view.setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
 view.setDragMode(QGraphicsView::ScrollHandDrag);
 view.setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Colliding Mice"));
 view.resize(1000, 800);
 view.show();

mainwindow.cpp : 没有黄色背景

 QGraphicsScene scene;
 QGraphicsView *view = new QGraphicsView();
 view->setScene(&scene);

 view->setRenderHint(QPainter::Antialiasing);
 view->setBackgroundBrush(Qt::yellow);
 view->setCacheMode(QGraphicsView::CacheBackground);
 view->setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate);
 view->setDragMode(QGraphicsView::ScrollHandDrag);
 view->setWindowTitle(QT_TRANSLATE_NOOP(QGraphicsView, "Colliding Mice"));
 view->resize(1000, 800);
 view->show();
4

3 回答 3

2

你想要' setScene '而不是'addScene'。由于一次只能将一个场景设置为视图,因此“设置”是函数名称的正确词,这意味着它会替换之前存在的任何场景。'add' 意味着即使添加了新场景,旧场景仍然存在,而QGraphicsView.

QGraphicsScene scene;
QGraphicsView *view = new QGraphicsView();
view->setScene(&scene); //<--- The function name you want.

当然,您的 QGraphicsView 需要实际设置为您的主窗口。如果您希望它填满整个主窗口,请使用:

this->setCentralWidget(view); //Assuming 'this' is the QMainWindow widget.

正如@Merlin069 建议的那样。

如果您不希望它填满整个窗口,但还想要其他东西,您应该向主窗口小部件添加一个布局,并将视图添加到布局中:

//Create the layout.
QHBoxLayout *horizontalLayout = new QHBoxLayout;

//Add widgets to the layout.
horizontalLayout->addWidget(sidepanelOnTheLeft);
horizontalLayout->addWidget(view);
horizontalLayout->addWidget(sidepanelOnTheRight);

//Set the layout to the widget that owns it.
this->centralWidget()->setLayout(horizontalLayout);

Qt 的文档非常好。你绝对应该收藏:

Qt 文档:类索引

于 2013-07-23T15:05:50.510 回答
2

新答案,因为它正在回答一个不同的问题,因为 OP 更新了问题

您的问题是QGraphicsScene scene;在函数本地创建的(我假设是 MainWindow 构造函数)。

这意味着它:

function()
{
   QGraphicsScene scene; //Creates the scene.
   QGraphicsView *view = new QGraphicsView(); //Creates the view
   view->setScene(&scene); //Adds the scene to the view, but *the view does not take ownership*

   //...other stuff...

   view->show(); //Show the view.

} //<--- The scene gets destroyed because it was local, and when being destroyed, removes itself from the view.

相反,QGraphicsScene 应该是动态分配的,并由 main 的“this”指针“拥有”(或者 main 的成员变量):

MainWindow::MainWindow()
{
   QGraphicsScene *scene = new QGraphicsScene(this /* Gives ownership to MainWindow */);
   QGraphicsView *view = new QGraphicsView(this /* Gives ownership to MainWindow */);
   view->setScene(scene);

   view->setWhateverSettingsYouWant();
   scene->setWhateverSettingsYouWant();

   //Tell the MainWindow that you want the view to be *inside* the MainWindow.
   //Also gives ownership to the MainWindow (again, but it won't hurt anything).
   this->setCentralWidget(view);
}

QWidgets(和QObjectsQWidgets继承)具有父->子层次结构。当父母被摧毁时,它也会释放每个孩子。这很重要。如果你只是“新”的东西,它们永远不会被删除!所以它们必须由父级“拥有”,所以当父级本身被销毁时,父级可以删除它们。

于 2013-07-23T15:52:55.963 回答
1

除了@JaminGrey 的回答,还可以调用QMainWindow 函数setCentralWidget,传递QGraphicsView 对象将其添加到QMainWindow。

如果您不使用 QMainWindow,请调用 QGraphicsView 函数 show()。请注意,您还需要将对象添加到 QGraphicsScene 以查看某些内容。

确保 QGraphicsScene 在添加到 QGraphicsView 之前是动态分配的,因为视图需要指向场景的指针。

于 2013-07-23T15:09:03.417 回答