如何将图像加载到painter.drawimage函数
Posted
技术标签:
【中文标题】如何将图像加载到painter.drawimage函数【英文标题】:how to load image to painter.drawimage function 【发布时间】:2014-01-13 10:46:20 【问题描述】:我已将图像存储在板子本地目录(/home/images/system/image.png)中
painter.drawimage 函数将 Qpoint 和 Qimage 作为参数传递。
painter.drawImage(QRect(100, 50, 100, 100), QImage("home/images/system/image.png"));
我可以在这里直接使用图像路径吗?如果我这样加载它不起作用 这是传递存储在板目录中的图像路径的正确方法吗?
【问题讨论】:
你应该使用资源:qt-project.org/doc/qt-5.0/qtcore/resources.html 如果我们存储本地目录,如何传递路径? 查看此讨论:***.com/questions/7741444/qt-how-to-access-resources 一个小问题,你在哪里画画?在小部件或 QImage 上?你什么时候画一幅画?是在paintEvent
还是其他方法(初学者常见的错误)。
我在 Qimage 上作画。实际上我是在覆盖图像。
【参考方案1】:
您可以自己看到位置和您尝试加载的路径之间的不一致:
我已将图像存储在板子本地目录(/home/images/system/image.png)中
然后:
painter.drawImage(QRect(100, 50, 100, 100), QImage("home/images/system/image.png"))
您缺少绝对路径的前导斜杠。为什么您的程序目前无法运行,这是因为程序正在寻找相对于应用程序的图像,而不是绝对路径。
解决方案是对上述行进行如下小修复:
painter.drawImage(QRect(100, 50, 100, 100), QImage("/home/images/system/image.png"))
^
但是,这只是一种快速的解决方法。在理想情况下,您不会真正加载这样的图像,尤其是不会从与运行应用程序的用户不同的主文件夹中加载。
如果您使用相同用户的主目录,则不会使用硬编码路径,而是使用来自QStandardPaths 的以下选项:
QStandardPaths::HomeLocation 8 Returns the user's home directory.
除非真的有必要,否则硬编码这样的长绝对路径是一种非常糟糕的做法,但这种情况很少见。
或者,您也可以将图像放在应用程序旁边,并按以下方式加载:
painter.drawImage(QRect(100, 50, 100, 100),
QImage(QString("%1/image.png")
.arg(QCoreApplication::applicationDirPath()));
根据QCoreApplication documentation for this method。
我可能会坚持最新的选项,或者至少是前面提到的没有硬编码的主路径。
当然,您也可以随时使用Qt resource system,但我认为在这种简单的情况下这有点过分,除非您希望将图像捆绑在一起以便您不需要部署它分别地。在这种情况下,您将编写如下内容:
painter.drawImage(QRect(100, 50, 100, 100), QImage(":/image.png"));
您的 .pro qmake 文件中的资源文件如下:
RESOURCES += myresourcefile.qrc
资源文件将包含如下内容:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>image.png</file>
</qresource>
</RCC>
【讨论】:
【参考方案2】:-
你缺少前斜线
在绘画事件中加载图像是不好的方法
试试这个:
。
QImage img("/home/images/system/image.png");
Q_ASSERT(!img.isNull());
painter.drawImage(QRect(100, 50, 100, 100), img);
【讨论】:
我需要在资源文件夹中加载图片吗? 这里没有资源是一个选项。 IMO 它与您的问题无关。如果您在小部件中绘画,则将 QImage 设为该小部件的字段,以防止多次重新加载图像。此断言仅确保图像已正确加载,您的问题是路径中的拼写错误。【参考方案3】:代替
painter.drawImage(QRect(100, 50, 100, 100), QImage("/home/images/system/charge1.png"));
你可以使用
QImage image("home/images/system/charge1.png");
painter.drawImage(rect, image);
在文档中你可以看到
QRectF target(10.0, 20.0, 80.0, 60.0);
QRectF source(0.0, 0.0, 70.0, 40.0);
QImage image(":/images/myImage.png");
QPainter painter(this);
painter.drawImage(target, image, source);
在链接处:http://qt-project.org/doc/qt-4.8/qpainter.html#drawImage-5
另外,我建议你在 Qt 中使用资源文件:
http://qt-project.org/doc/qt-5.0/qtcore/resources.html http://qt-project.org/doc/qt-4.8/designer-resources.html【讨论】:
请不要为你使用'u'。这是最烦人的写作类型之一以上是关于如何将图像加载到painter.drawimage函数的主要内容,如果未能解决你的问题,请参考以下文章
Qt之图形(Source和Dest相互覆盖的取舍,真的很方便)
如何从 HTTP 请求将图像加载到 UIButton Swift