如何在QMainWindow中更新QGraphicsScene

时间:2017-03-09 17:55:06

标签: c++ qt

我正在尝试在Qt中创建一个简单的Mandlebrot查看器,我有一个带有QGraphicsScene的Mainwindow,我用图片生成QImage然后我有一些我想用来导航图像的按钮(移动,缩放等)

我可以看到初始图像,但是我不知道如何在我改变任何坐标后告诉它重新渲染。 对于我的生活,我无法弄清楚如何刷新QMainWindow,或者从MainWindow中删除QGraphicsScene并调用它来渲染它。

QImage renderImage(//loads in global variables)
{
    //calculates the image and returns a QImage
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QGraphicsScene *graphic = new QGraphicsScene( this );
    graphic->addPixmap(QPixmap::fromImage(renderImage()));
    ui->graphicsView->setScene(graphic);

}

void MainWindow::on_Left_clicked()
{
    // Changes global variables and try to rerender the scene.

    update(); //does nothing
}

更新:解决了! 非常感谢goug,这对我有很大的帮助。我是Qt的新手,所以无法解决循环更新的问题。我添加了你建议的代码,它工作得很好。谢谢:))

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QGraphicsScene *graphic = new QGraphicsScene( this );
    pixmap_item = graphic->addPixmap(QPixmap::fromImage(renderImage()));
    ui->graphicsView->setScene(graphic);

}

void MainWindow::on_Left_clicked()
{
    // Changes global variables and try to rerender the scene.
    centerR -= 0.1;
    pixmap_item->setPixmap(QPixmap::fromImage(renderImage()));
}

1 个答案:

答案 0 :(得分:1)

您不会显示任何更改任何坐标或任何内容的代码。对于内置图形项目,例如QGraphicsPixmapItem,这是您通过调用addPixmap创建的内容,您通常不必强制执行任何操作。当您通过其成员函数更改某些内容时,这些对象会根据需要重新绘制。

我怀疑你出错的地方是你可能相信pixmap和你在构造函数中创建的QGraphicsPixmapItem之间存在联系。没有;因此,如果它是您正在更改的像素图,那么您需要将该像素图重新应用于像素图项目。您需要班级中的新成员跟踪:

QGraphicsPixmapItem *pixmap_item_;

并将构造函数代码更改为:

pixmap_item_ = graphic->addPixmap(QPixmap::fromImage(renderImage()));

然后,只要您更新了pixmap,请将pixmap重新应用到您在构造函数中创建的图形项目中:

pixmap_item_->setPixmap (QPixmap::fromImage(renderImage()));

setPixmap调用将触发pixmap项目重绘自身;您不必单独致电update()。如果这不是问题,那么我们需要查看更多代码。