我正在使用Qt4.6,32位在64位Linux下编译,并且有一个令人费解的内存问题,我无法弄清楚。我有一个包含QLabel的QWidget。这个QLabel作为每个重绘设置的绘画区域:
m_label->setPixmap(QPixmap::fromImage(image));
图像在小部件paintEvent:
中更新void MemTest::paintEvent(QPaintEvent* pEvent)
{
// Wait for latest painting if not finished, then perform threaded repaint
m_plotThread->wait();
m_plotThread->start();
}
也就是说,使用QThread执行绘制线程,其中线程函数如下所示:
void PlotThread::run()
{
// Lock the thread
m_mutex.lock();
// Image for painting
QImage image(400, 300, QImage::Format_ARGB32);
image.fill(0);
// Create painter on the image
QPainter painter(&image);
painter.setRenderHint(QPainter::Antialiasing, true);
QFont font("Helvetica", m_textSize);
painter.setFont(font);
painter.setPen(QColor(255,0,0));
painter.setBrush(QColor(130,150,255));
// Draw some shapes
painter.drawLine(0, 0, 400, 300);
painter.setPen(QColor(40,30,30));
painter.drawEllipse(15, 50, 130, 90);
// Draw the text
// !!! This causes memory leak !!!
painter.drawText(QPoint(40, 100), "What's my problem?");
m_mutex.unlock();
// Send painted image through signal
emit plotFinished(image);
}
一切都按预期工作,除了drawText导致严重的内存泄漏,在多次绘画后很容易检测到。仅在绘制完成线程并使用drawText时才会出现此问题。如果删除了drawText,或者直接使用了drawText,而没有使用线程,则在小部件paintEvent中没有问题。例如,使用drawLine,drawRect,drawEllipse等多线程绘画没有问题。
这种行为有解释吗?并且drawText函数如何在不导致泄漏的情况下使用多线程?
答案 0 :(得分:0)
虽然非GUI线程中QImage
支持大多数绘图操作,但X11系统上有supportsThreadedFontRendering
关于是否允许文本渲染的内容:
http://doc.qt.nokia.com/4.7-snapshot/qfontdatabase.html#supportsThreadedFontRendering
我不确定你的系统上有哪个标志返回。但即使它说“真实”,那么你的配置中可能还有足够的黑魔法,它将无效。
关于Qt处理穿线和油漆操作细节的其他一些重要说明,请看这里:
http://doc.qt.nokia.com/4.7-snapshot/threads-modules.html#painting-in-threads