Настройка алгоритма рисования QPaintPath в QWidget - PullRequest
0 голосов
/ 06 марта 2012

Как можно настроить алгоритм рисования QPainterPath?

Я бы хотел ускорить свое приложение, рисуя только видимые элементы.

Я рисую график в реальном времени из QPainterPathи хотел бы сделать это:

  1. Двоичный поиск крайнего левого видимого элемента QPainterPath.
  2. Двоичный поиск крайнего правого видимого элемента QPainterPath.
  3. Рисовать только видимые элементы.

Думаю, мне следует настроить QPaintEngine моего QWidget с помощью QWidget::paintEngine().

Но QPaintEngine::drawPath(...) реализация по умолчанию ничего не делает .

Я прав или нет?

ОБНОВЛЕНИЕ:

Спасибо за респондент, Койинг.

Я только что попробовал так:

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), 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 *) Строка 172 + 0x13 байт C ++

при вызовеelementAt (i), i == 4303 и 5459 элементов.

Может быть, количество элементов не является действительным на момент сбоя?

Может ли второй поток изменять количество элементов, когда происходит сбой первого потока?

Вот как работают мои темы: Мой поток графического интерфейса использует только методы только для чтения.Мой второй поток добавляет 1-5 тысяч очков в секунду.

1 Ответ

1 голос
/ 06 марта 2012

QPaintEngine - это абстрактный интерфейс к базовому, ориентированному на платформу движку рисования, то есть GDI в Windows, X в Linux, какао в Mac и т. Д., Поэтому это не то, что вам нужно.

Что вам нужно сделать, это отредактировать QPainterPath, чтобы удалить элементы, которые вы не хотите рисовать. QPainterPath - это просто список примитивов, немного похожий на SVG, а не какое-то растровое изображение.

...