在QWidget上自定义QPaintPath绘图算法

时间:2012-03-06 08:54:59

标签: qt plot real-time qwidget qpainter

如何自定义QPainterPath的绘图算法?

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

我正在从QPainterPath绘制实时情节,并希望这样做:

  1. 二进制搜索QPainterPath最左边的可见元素。
  2. 二进制搜索QPainterPath最右边的可见元素。
  3. 仅绘制可见元素。
  4. 我想我应该通过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千点。

1 个答案:

答案 0 :(得分:1)

QPaintEngine是底层的,特定于平台的绘图引擎的抽象接口,即Windows上的GDI,Linux上的X,Mac上的可可等......所以不是您想要的。< / p>

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