定制QWidget上的QPaintPath绘图算法

问题描述:

如何定制QPainterPath的绘图算法?定制QWidget上的QPaintPath绘图算法

我想通过仅绘制可见元素来加速我的应用程序。

我借鉴QPainterPath实时图表,想做到这一点:

  1. 二进制搜索QPainterPath的最左侧可视元素。
  2. 二进制搜索QPainterPath最右边的可见元素。
  3. 仅绘制可见元素。

我想我应该通过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个点。

+0

或者我需要QPainterPath的子类来修改它的行为? – k06a 2012-03-06 09:23:47

+0

如果您在其他线程中修改了QPainterPath,那么您将遇到麻烦......您将不得不添加互斥锁 – Koying 2012-03-06 16:12:02

+0

“迭代”是什么意思?我只使用elementAt()和elementCount()方法... – k06a 2012-03-06 18:20:23

QPaintEngine是底层,特定于平台的绘制引擎的抽象接口,即Windows上的GDI,Linux上的X,Mac上的可可等等......所以不是你要找的东西。

你应该做的是编辑你的QPainterPath删除你不想被绘的元素。 QPainterPath只是一个基元列表,有点像SVG,不是某种位图。