定制QWidget上的QPaintPath绘图算法
如何定制QPainterPath的绘图算法?定制QWidget上的QPaintPath绘图算法
我想通过仅绘制可见元素来加速我的应用程序。
我借鉴QPainterPath实时图表,想做到这一点:
- 二进制搜索QPainterPath的最左侧可视元素。
- 二进制搜索QPainterPath最右边的可见元素。
- 仅绘制可见元素。
我想我应该通过QWidget::paintEngine()
来定制QWidget的QPaintEngine。
但是QPaintEngine::drawPath(...)
默认执行does nothing。
我对吗?
UPDATE:
感谢respounce,Koying。
我刚刚tryed这样:
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并从另一个线程将元素添加到它。 有时应用程序崩溃与调用堆栈:!
QtCored4.dll qt_message_output(QtMsgType MSGTYPE,为const char * BUF)线2240 C++ QtCored4.dll qt_message(QtMsgType MSGTYPE,为const char *味精,字符* AP)线2298 + 0x12字节C++ QtCored4.dll!qFatal(const char * msg,...)行2481 + 0xf字节C++ QtCored4.dll!qt_assert(const char *断言,const char *文件,int行)行1999 + 0x16字节C++ QtGuid4.dll!QPainterPath :: elementAt(int i)行405 + 0x36字节C++ MyPlot.dll!MyPlot :: paintEvent(QPaintEvent * event)行172 + 0x13字节C++
while calling elementAt(i),i == 4303 and there are 5459 elements。
也许元素计数是不是真正的崩溃时刻?
当第一个线程崩溃时,第二个线程可以修改元素数量吗?
这是如何工作我的线程: 我的gui线程只使用只读方法。 我的第二个线程每秒增加1-5000个点。
QPaintEngine
是底层,特定于平台的绘制引擎的抽象接口,即Windows上的GDI,Linux上的X,Mac上的可可等等......所以不是你要找的东西。
你应该做的是编辑你的QPainterPath
删除你不想被绘的元素。 QPainterPath
只是一个基元列表,有点像SVG,不是某种位图。
或者我需要QPainterPath的子类来修改它的行为? – k06a 2012-03-06 09:23:47
如果您在其他线程中修改了QPainterPath,那么您将遇到麻烦......您将不得不添加互斥锁 – Koying 2012-03-06 16:12:02
“迭代”是什么意思?我只使用elementAt()和elementCount()方法... – k06a 2012-03-06 18:20:23