使用 QPainter 渲染 SVG 文件
Rendering an SVG file with QPainter
我有一组SVG文件,我想在QWidget中用作图标。在我的QWidget画图函数中,我有以下内容:
void Tool::paintEvent(QPaintEvent *e) {
QImage icon = QImage(32, 32, QImage::Format_ARGB32);
QSvgRenderer *ren = new QSvgRenderer(QString(m_part_dir.c_str()) + "\drawing.svg");
QPainter painter(&icon);
ren->render(&painter);
}
我已经查看了有关如何执行此操作的多个建议,并且这种方法不断出现。但是,当我运行此代码时,它会引发异常。在线上:
ren->render(&painter);
中断在名为 dbgrptt.c 的文件中停止:
_CRTIMP void __cdecl _CrtDbgBreak(
void
)
{
__debugbreak();
}
调用堆栈如下所示:
msvcr110d.dll!_CrtDbgBreak() Line 87 C
msvcr110d.dll!_VCrtDbgReportW(int nRptType=2, void * returnAddress=0x0f8a7553, const wchar_t * szFile=0x0f793148, int nLine=52, const wchar_t * szModule=0x00000000, const wchar_t * szFormat=0x0f77127c, char * arglist=0x0029e954) Line 506 C
msvcr110d.dll!_CrtDbgReportWV(int nRptType=2, void * returnAddress=0x0f8a7553, const wchar_t * szFile=0x0f793148, int nLine=52, const wchar_t * szModule=0x00000000, const wchar_t * szFormat=0x0f77127c, char * arglist=0x0029e954) Line 262 C++
msvcr110d.dll!_CrtDbgReportW(int nRptType=2, const wchar_t * szFile=0x0f793148, int nLine=52, const wchar_t * szModule=0x00000000, const wchar_t * szFormat=0x0f77127c, ...) Line 279 C++
msvcr110d.dll!operator delete(void * pUserData=0x031392e0) Line 52 C++
QtGuid4.dll!QPenPrivate::`scalar deleting destructor'(unsigned int) C++
QtGuid4.dll!QPen::~QPen() Line 346 C++
QtGuid4.dll!QPaintEngineExPrivate::~QPaintEngineExPrivate() Line 172 C++
QtGuid4.dll!QRasterPaintEnginePrivate::~QRasterPaintEnginePrivate() C++
QtGuid4.dll!QRasterPaintEnginePrivate::`scalar deleting destructor'(unsigned int) C++
QtGuid4.dll!QScopedPointerDeleter<QPaintEnginePrivate>::cleanup(QPaintEnginePrivate * pointer=0x03135d80) Line 62 C++
QtGuid4.dll!QScopedPointer<QPaintEnginePrivate,QScopedPointerDeleter<QPaintEnginePrivate> >::~QScopedPointer<QPaintEnginePrivate,QScopedPointerDeleter<QPaintEnginePrivate> >() Line 100 C++
QtGuid4.dll!QPaintEngine::~QPaintEngine() Line 723 C++
QtGuid4.dll!QPaintEngineEx::~QPaintEngineEx() C++
QtGuid4.dll!QRasterPaintEngine::~QRasterPaintEngine() Line 428 C++
QtGuid4.dll!QRasterPaintEngine::`scalar deleting destructor'(unsigned int) C++
QtGuid4.dll!QImageData::~QImageData() Line 224 C++
QtGuid4.dll!QImageData::`scalar deleting destructor'(unsigned int) C++
QtGuid4.dll!QImage::~QImage() Line 1283 C++
SystemDesigner_d.exe!Parts::Tool::paintEvent(QPaintEvent * e=0x0029f238) Line 39 C++
谁能理解这一点?
我找到了一种方法。我在使用 .svg 文件构建对象时创建了一个 QIcon。然后我使用QPainter.drawPixmap绘制QIcon的pixmap。
在初始值设定项列表中m_icon(QString(m_part_dir.c_str()) + "\icon.svg")
绘制事件:
void Tool::paintEvent(QPaintEvent *e) {
QPainter painter(this);
painter.setPen(QPen(Qt::gray, 1));
painter.drawRect(0, 0, TOOL_WIDTH-1, TOOL_HEIGHT);
//QIcon icon(QString(m_part_dir.c_str()) + "\icon.svg");
painter.drawPixmap(4, 4, 32, 32, m_icon.pixmap(QSize(32,32)));
int text_y = TOOL_HEIGHT / 2 + 3;
painter.setPen(QPen(Qt::black, 1));
QString name(m_data["name"].c_str());
painter.drawText(40, text_y, name);
}
感谢库巴·奥伯的建议。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- 在 Win32 (C++) 中打开、操作和呈现 SVG 文件
- 如何将SVG文件转换为等效的GDI+对象
- 使用C/ c++打开和编辑SVG文件
- 如何使用cairo将图像写入SVG文件
- 使用 QPainter 渲染 SVG 文件