Настройка алгоритма рисования QPaintPath на QWidget

Как можно настроить алгоритм рисования 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);

Все работает красиво! У меня фиксированные затраты времени для любого количества элементов.

Есть ли у вас какие-либо предложения по ускорению моего кода?

ОБНОВЛЕНИЕ:

У меня ошибка при чтении QPainterPath и добавлении к нему элементов из другого потока. Иногда приложение вылетает со стеком вызовов:

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 элементов.

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

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

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


person k06a    schedule 06.03.2012    source источник
comment
Или мне нужен подкласс QPainterPath, чтобы изменить его поведение?   -  person k06a    schedule 06.03.2012
comment
Если ваш QPainterPath изменен в другом потоке во время его итерации, у вас возникнут проблемы... Вам придется добавить Mutex   -  person Chris Browet    schedule 06.03.2012
comment
Что вы имели в виду повторение? Я использую только методы elementAt() и elementCount()...   -  person k06a    schedule 06.03.2012
comment
При выполнении цикла for вы перебираете элементы списка, в данном случае элементы, составляющие QPainterPath.   -  person Chris Browet    schedule 06.03.2012


Ответы (1)


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

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

person Chris Browet    schedule 06.03.2012