2

の呼び出しによって発生した不要なビューポート ( QGraphicsView) の更新に問題がQStackedWidget::setCurrentIndex()ありQStackedWidgetます。インスタンスはシーンの一部ではありません。

これはすべてのシーンで発生するわけではなく、大きなシーンだけがこの問題の影響を受けないようです。

私のコードにはこれに関連するものは何も見つかりません。私の問題に答えるために何が必要なのかよくわかりません。情報が不足していて申し訳ありません。必要なものと最初に確認すべきことを教えてください。 .

ui->inspectorWidget6ページのQStackedWidgetインスタンスです。

ui->mapおよびインスタンスですui->map3DQGraphicsView

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

1 に答える 1

0

さて、ui->map->fitInView() または ui->map->centerOn() を無効にし、これらの行を 1 つずつ再度有効にして、ビューポートを更新する行を分離することで、問題の原因を突き止めました。

問題を引き起こした機能は次のとおりです。

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デザイナー、卑劣なスロットの信号に接続されていました:)

于 2014-05-26T07:56:54.377 に答える