【发布时间】:2014-05-25 15:02:03
【问题描述】:
我在调用 QStackedWidget::setCurrentIndex() 导致不需要的视口 (QGraphicsView) 更新时遇到问题,QStackedWidget 实例不是场景的一部分。
并非所有场景都会出现这种情况,似乎只有较大的场景才能避免此问题。
我在我的代码中找不到与此相关的任何内容,而且我真的不知道您需要什么来回答我的问题,因此对于缺少信息感到非常抱歉,请告诉我您需要什么以及我需要什么应该先检查。
ui->inspectorWidget 是一个 6 页的 QStackedWidget 实例。
ui->map 和 ui->map3D 是 QGraphicsView 实例。
scene = ui->map->scene 是 QGraphicsScene。
void Class::on_toggle3D_released()
{
//3D to 2D
if(ui->map3D->isVisible())
{
myWindow::on = false;//Prevents OpenGL rendering
for(...)
{
//Coordinates calculations
//Adding a rectangle to the scene
QGraphicsRectItem *item = new QGraphicsRectItem(x,y,w,h);
item->setBrush(QBrush(r,g,b,255)));
scene.addItem(item);
}
//QRectF visibleRec = ui->map->mapToScene(ui->map->viewport()->rect()).boundingRect();
ui->inspectorWidget->setCurrentIndex(0);//Where the viewport is changed
//ui->map->setSceneRect(visibleRec); <- a first attempt to solve this
ui->map->setVisible(true);
ui->map3D->setVisible(false);
ui->toggle3D->setText("3D");
ui->map3D->viewport()->releaseKeyboard();
}
//2D to 3D
else
{
//2D rectangles cleaning
foreach(QGraphicsItem * item,scene.items())
{
if(item->type() == QGraphicsRectItem::Type)
{
scene.removeItem(item);
}
}
scene.items().clear();
//Creating texture from 2D view, that's why I need the view not to change after this step
QImage img(ui->map->width(), ui->map->height(),QImage::Format_ARGB32_Premultiplied);
QPainter p(&img);
ui->map->viewport()->render(&p);
p.end();
img.save("tmp.png");
//Updates scene and view information in QGLWidget class
((myWindow *)ui->map3D->viewport())->setSceneWidth(scene.width());
((myWindow *)ui->map3D->viewport())->setSceneHeight(scene.height());
((myWindow *)(ui->map3D->viewport()))->setViewport(ui->map->mapToScene(ui->map->viewport()->rect()).boundingRect());
myWindow::reload = true;//Texture reloading
myWindow::on = true;//Allows OpenGL rendering
//QRectF visibleRect = ui->map->mapToScene(ui->map->viewport()->rect()).boundingRect();
ui->inspectorWidget->setCurrentIndex(5);//Where the viewport is changed
//ui->map->setSceneRect(visibleRect); <- the same attempt
ui->map3D->viewport()->grabKeyboard();
ui->map3D->setVisible(true);
ui->map->setVisible(false);
ui->toggle3D->setText("2D");
}
}
【问题讨论】:
-
你能显示一些代码吗?
-
您好,感谢您的帮助。我进行了编辑以显示我遇到此问题的功能,尽管我怀疑它是否会有很大帮助。我不能真正展示所有内容,因为它很长而且我不被允许。我应该寻找一些特定的东西,比如这个函数可以发出的信号吗?
标签: qt viewport qgraphicsview qstackedwidget