【问题标题】:How to work with QGraphicsScene::addPixmap when it only accepts const QPixmap?当 QGraphicsScene::addPixmap 只接受 const QPixmap 时如何使用它?
【发布时间】:2014-04-22 06:34:11
【问题描述】:

我想显示一些QImageQGraphicsScene,我的代码非常简单:

ma​​inwindow.h

QImage *sourceImage;
QGraphicsView *imageView;
QGraphicsScene *imageScene;

ma​​inwindow.cpp

imageScene = new QGraphicsScene;
imageView = new QGraphicsView;
imageView->setScene(imageScene);

sourceImage = new QImage;
sourceImage.load(":/targetimage.png");
imageScene.addPixmap(QPixmap::fromImage(sourceImage));

然后编译器指出我做错了什么:QGraphicsScene::addPixmap 仅接受 const QPixmap 作为参数,我试图将 QImage 转换为 const QPixmap,这是不允许的,因为 QPixmap::fromImage 仅在接受const QImage,就像const 地狱。

这个方法上的official documentation 对我来说也没有多大意义,例如,如果我想做一个图像查看器,并且在运行时我肯定会将不同的图像加载到QImage sourceImage 中,并且我怎样才能使用const QImage 来做到这一点?

这个问题一直很痛苦,感谢您的建议。此外,如果对 Qt 中的人使用这些方法const 的哲学原因有任何看法,您能否给我一点启发?

【问题讨论】:

  • 是什么阻止您使用 QPixmaps 而不是 QImages?
  • 我也在使用 opencv,这意味着我会不断地将 cv::Mat 转换为 QImage 并返回。根据文档,QPixmap 针对显示进行了优化。我相信有一些方法可以将QPixmap 转换为 cv::Mat 但QImage 非常适合问题空间。

标签: qt qgraphicsview qgraphicsscene qimage qpixmap


【解决方案1】:

试试

imageScene.addPixmap(QPixmap::fromImage(*sourceImage));

一些建议:

不需要在堆上分配 QImage(使用新的)。 使用:

QImage sourceImage;

那么在调用QPixmap::fromImage的时候就不需要解引用指针了

澄清一下:常量与错误无关。

【讨论】:

  • 这很简单,也很鼓舞人心。我已经阅读了一些指针并更新了我的 C++ 知识,但我忍不住要问,因为 sourceImage 指向的是什么类型 QImage 而不是 const QImage,为什么像 QPixmap::fromImage(const QImage) 这样的方法仍然接受 *sourceImage作为一个有效的论点?
  • 因为限制只有一种方式。如果该方法有一个 const 参数,这意味着承诺不会更改您传递给它的内容。如果反过来,你将一个 const 对象作为一个非常量参数传递,你会给一个声明“我将修改这个”的函数提供一些永远不应该修改的东西
  • 虽然解决了 timfeirg 似乎遇到的一个问题(不理解函数的 const 参数只是函数承诺不更改该参数),但这并不能回答他的问题在那里问,这是:为什么一个具有文档签名的函数说它只将一个对象作为参数,而不是接受一个指向该对象的指针作为参数?这甚至是如何编译的?我对此没有答案。我认为这有点神奇。
  • 函数不接受指针。 *sourceImage 不是指针,您正在取消引用指针(使用 * 运算符),因此您可以获取对象本身。 *sourceImage 的类型是 QImage,这对于 const QImage 类型的参数是可接受的。你给它一些可以修改的东西,但是函数说'我不会修改它',这没关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多