Как я могу сказать, что QGraphicsItem :: paint () вызывается для печати? - PullRequest
0 голосов
/ 26 февраля 2011

У меня есть пользовательский QGraphicsItem, который отображает большие (многоканальные сжатые, многоканальные) изображения.Сейчас он работает довольно хорошо.

Идея состоит в том, чтобы загружать только линии сканирования, которые необходимы для текущего масштаба представления и порта графического представления.И разделить дисплей на плитки, которые построены в отдельных потоках.Функция paint() только создает плитки и передает их в QThreadPool.Это также проверяет и рисует любые плитки, которые сделаны.Есть больше кода, обрабатывающего события между потоками / runnables и элементом.Но это основная часть.

Цель - предоставить отзывчивый пользовательский интерфейс.Когда элемент обновляется сам, пользовательский интерфейс не блокируется.Все это работало хорошо, пока я не попытался понять, как его напечатать.

Проблема в том, что мне нужно знать, что конкретный вызов моей функции рисования происходит в результате печати, а не обновления экрана.Это необходимо, чтобы заблокировать основной поток, пока все мои плитки не будут сделаны и нанесены на рисовальщик (или распечатанная страница будет пустой, поскольку paint () сразу же вернется)

Это также помогает настроить частоту выборки, так какпринтер имеет более высокое разрешение, чем экран.

Итак, мой вопрос сводится к следующему: Как я могу узнать, передан ли QPainter моему paint() экран или принтер.А еще лучше, я могу сказать, является ли вызов для предварительного просмотра или фактической печати?

Спасибо.

1 Ответ

2 голосов
/ 26 февраля 2011

Просто идея, у вас нет принтера прямо сейчас, чтобы проверить его.

Существует метод device () в классе QPainter , который возвращает устройство рисования, на котором в данный момент рисует этот художник, или 0, если художник не активен.Устройство рисования может быть реализовано с помощью QWidget , QImage , QPixmap , QGLPixelBuffer , QPicture и QPrinter подклассы.Поэтому я считаю, что если вы проверите, если ваше устройство имеет тип QPrinter , это будет означать, что вы печатаете прямо сейчас.

Что-то вроде этого:

QPaintDevice* device = painter->device();
if (dynamic_cast<QPrinter*>(device)!=NULL)
    qDebug() << "QPrinter";
else if (dynamic_cast<QWidget*>(device)!=NULL)
    qDebug() << "QWidget";
else if (dynamic_cast<QImage*>(device)!=NULL)
    qDebug() << "QImage";
else if (dynamic_cast<QPixmap*>(device)!=NULL)
    qDebug() << "QPixmap";
else if (dynamic_cast<QPicture*>(device)!=NULL)
    qDebug() << "QPicture";
else
    qDebug() << "something else";

надеюсь, это поможет, с уважением

...