Qt图形视图,显示图像!,小工具

Dav*_*ani 10 graphics qt image view qgraphicsview

这是我的代码:

void MainWindow::on_actionOpen_Image_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());

    if(!fileName.isEmpty())
    {
        QImage image(fileName);

        if(image.isNull())
        {
            QMessageBox::information(this,"Image Viewer","Error Displaying image");
            return;
        }

        QGraphicsScene scene;
        QGraphicsView view(&scene);
        QGraphicsPixmapItem item(QPixmap::fromImage(image));
        scene.addItem(&item);
        view.show();   
    }
Run Code Online (Sandbox Code Playgroud)

}

我想从文件显示图像,代码工作正常,但图像的速度非常快.

如何暂停图像屏幕?

如何在"graphicsView"小部件中加载图像?

我的代码:

void MainWindow::on_actionOpen_Image_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this,"Open Image File",QDir::currentPath());

    if(!fileName.isEmpty())
    {
        QImage image(fileName);

        if(image.isNull())
        {
            QMessageBox::information(this,"Image Viewer","Error Displaying image");
            return;
        }

        QGraphicsScene scene;
        QGraphicsPixmapItem item(QPixmap::fromImage(image));
        scene.addItem(&item);

        ui->graphicsView->setScene(&scene);
        ui->graphicsView->show();    
    }
}
Run Code Online (Sandbox Code Playgroud)

这是行不通的.

如何解决这个问题?

lau*_*ent 19

您需要在堆上创建所有对象,否则当它们超出范围时会被删除:

QGraphicsScene* scene = new QGraphicsScene();
QGraphicsView* view = new QGraphicsView(scene);
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(QPixmap::fromImage(image));
scene->addItem(item);
view->show();
Run Code Online (Sandbox Code Playgroud)

你的第二个问题可能是相关的 - scene被分配给ui->graphicsView但是它会立即删除,所以再次在堆上创建所有对象.

  • 是的,您需要通过删除来清理自己。我建议您将 QGraphicsScene (和 QGraphicsPixmapItem 如果在 additem 期间没有被复制)声明为类指针变量。然后我建议您在声明变量时使用某种智能指针,例如 QSharedPointer: <in class header> QSharedPointer<QGraphicsScene> ptr_scene; <在源文件中> this->ptr_scene = QSharedPointer<QGraphicsScene>(new QGraphicsScene()) 然后当MainWindow关闭时管理内存。 (2认同)

小智 6

如果您不必坚持使用QGraphicsView,则可以使用QLabel.我没有设法为QGraphicsView解决它...

QString filename = "X:/my_image";
QImage image(filename);
ui->label->setPixmap(QPixmap::fromImage(image));
Run Code Online (Sandbox Code Playgroud)