如何自定义QPainterPath的绘图算法?
我想通过仅绘制可见元素来加速我的应用。
我正在从QPainterPath绘制实时情节,并希望这样做:
我想我应该通过QWidget::paintEngine()
自定义QWidget的QPaintEngine。
但QPaintEngine::drawPath(...)
默认实施does nothing。
我是对还是不对?
更新
谢谢你的反击,Koying。
我刚试过这样的方式:
int minIndex = BinarySearchForMatchOrGreat(path, beginOffset);
int maxIndex = BinarySearchForMatchOrGreat(path, endOffset);
QPainterPath newPath;
for (int i = minIndex; i < maxIndex; i++)
{
const QPainterPath::Element & element = path.elementAt(i);
newPath.moveTo(element.x, element.y);
}
painter.drawPath(newPath);
一切都很好!我有固定的时间开销用于任何元素计数。
您对加快我的代码有任何建议吗?
UDPATE:
我在读取QPainterPath并从另一个线程向其添加元素时遇到错误。 有时应用程序崩溃与callstack:
QtCored4.dll!qt_message_output(QtMsgType msgType,const char * buf)第2240行C ++ QtCored4.dll!qt_message(QtMsgType msgType,const char * msg,char * ap)2298行+ 0x12字节C ++ QtCored4.dll!qFatal(const char * msg,...)第2481行+ 0xf字节C ++ QtCored4.dll!qt_assert(const char * assertion,const char * file,int line)第1999行+ 0x16字节C ++ QtGuid4.dll!QPainterPath :: elementAt(int i)第405行+ 0x36字节C ++ MyPlot.dll!MyPlot :: paintEvent(QPaintEvent * event)第172行+ 0x13字节C ++
在调用elementAt(i)时,i == 4303并且有5459个元素。
也许元素数量不是真正的崩溃时刻?
第一个线程崩溃时,第二个线程可以修改元素数吗?
这是如何运作我的线程: 我的gui线程只使用只读方法。 我的第二个线程每秒增加1-5千点。
答案 0 :(得分:1)
QPaintEngine
是底层的,特定于平台的绘图引擎的抽象接口,即Windows上的GDI,Linux上的X,Mac上的可可等......所以不是您想要的。< / p>
您应该做的是编辑QPainterPath
以删除不想要绘制的元素。 QPainterPath
只是一个基元列表,有点像SVG,而不是某种位图。