QStackedWidget::setCurrentIndex() 改变场景视口

Posted

技术标签:

【中文标题】QStackedWidget::setCurrentIndex() 改变场景视口【英文标题】:QStackedWidget::setCurrentIndex() changes scene viewport 【发布时间】:2014-05-25 15:02:03 【问题描述】:

我在调用 QStackedWidget::setCurrentIndex() 导致不需要的视口 (QGraphicsView) 更新时遇到问题,QStackedWidget 实例不是场景的一部分。

并非所有场景都会出现这种情况,似乎只有较大的场景才能避免此问题。

我在我的代码中找不到与此相关的任何内容,而且我真的不知道您需要什么来回答我的问题,因此对于缺少信息感到非常抱歉,请告诉我您需要什么以及我需要什么应该先检查。

ui->inspectorWidget 是一个 6 页的 QStackedWidget 实例。

ui->mapui->map3DQGraphicsView 实例。

scene = ui->map->sceneQGraphicsScene

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");


【问题讨论】:

你能显示一些代码吗? 您好,感谢您的帮助。我进行了编辑以显示我遇到此问题的功能,尽管我怀疑它是否会有很大帮助。我不能真正展示所有内容,因为它很长而且我不被允许。我应该寻找一些特定的东西,比如这个函数可以发出的信号吗? 【参考方案1】:

好的,我通过禁用任何 ui->map->fitInView() 或 ui->map->centerOn() 并一一重新启用这些行以隔离更新视口的行,找到了导致问题的原因。

这是导致问题的函数:

void Class::ensureVisibleCheckedChanged(QTreeWidgetItem *item, int)

 if(item) 
    foreach(NetElement *element, elements) 
        if(element->friendlyName == item->text(0)) 
            ui->map->centerOn(element);//Where the viewport was changed
            if(item->checkState(0) == Qt::Checked)
                element->setVisible(true);
            else
                element->setVisible(false);
        
    
 

我不是写这个函数的人,它从来没有在任何地方被调用,我在 Qt 文档中找不到任何关于它的东西,但至少我现在可以处理这个了。

编辑:我找到了导致它被调用的原因:它连接到 Qt GUI 设计器中的一个信号,偷偷摸摸的插槽 :)

【讨论】:

以上是关于QStackedWidget::setCurrentIndex() 改变场景视口的主要内容,如果未能解决你的问题,请参考以下文章