Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Печать в отдельном потоке
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Система рисования. Печать
RazrFalcon
Простейший пример:
void MainWindow::onPrintClicked()
{
    m_printThread = new QThread(this);
    m_print = new Print;
    // передаем указатель на m_printer
    QPrintDialog(m_print->printer(), this);
    m_print->moveToThread(m_printThread);
    m_printThread->start();
    QMetaObject::invokeMethod(m_print, "print", Qt::QueuedConnection);
}

void Print::print()
{
    QPainter painter(m_printer);
    // рисуем нашу заранее подготовленную картинку с нужным масштабом
    painter.drawImage(0, 0, m_img.scaledToWidth(500, Qt::SmoothTransformation)));
}

Проблема в следующем: при печати pdf - все работает отлично, но при печати на реальный принтер получаю варнинг
QPixmap: It is not safe to use pixmaps outside the GUI thread
Дока говорит QPixmap в потоке использовать нельзя, а можно QImage, и именно его я и использую...
В итоге из-за варнингов этих на печати у меня пустые страницы... При том что drawLine и прочие примитивы печатает нормально. Не хочет только QImage.
В чем может быть проблема?
Litkevich Yuriy
Возможно сам Q-принтер (внутри использует QPixmap). Как вариант печатать только из главного потока (организовав очередь), а в эту очередь помещать QImage из разных потоков.
Iron Bug
я не спец в Qt, но у тебя объекты разные: в поток ты перенёс объект класса Print, а вызываешь метод класса PrintBook. скорее всего, часть класса PrintBook не будет адаптирована для работы в потоке.
RazrFalcon
Iron Bug, опечатка, поправил :rolleyes:

Litkevich Yuriy, так в том то и беда, что в основном потоке прога фризится. Да и QPrinter в pdf то нормально пишет. А на реальный принтер уже не хочет...
Попробую QImage рендерить в потоке, может и выгорит.
RazrFalcon
Цитата
Как вариант печатать только из главного потока (организовав очередь), а в эту очередь помещать QImage из разных потоков.

Все тормоза именно в painter.drawImage() и его то я не могу вынести в поток...
Litkevich Yuriy
Цитата(RazrFalcon @ 3.7.2013, 20:53) *
Попробую QImage рендерить в потоке, может и выгорит.
а я понял, что ты его уже и используешь:
Цитата(RazrFalcon @ 3.7.2013, 15:49) *
а можно QImage, и именно его я и использую...


К стати, по моим субъективным наблюдениям Qt::SmoothTransformation заставляет заметно потеть функцию масштабирования.
RazrFalcon
Да, почти в два раза дольше, но картинка лучше немного.
В общем идея вынести печать полностью в поток, а не частично. Пока никак...
Litkevich Yuriy
В общем, проверь у себя такую вещь: использование одного экземпляра QPrinter в разных потоках - источник проблем.

Пробуй создать экземпляр принтера в неком потоке и всю печатную обработку суй в этот же поток.
RazrFalcon
В общем да, по сути в этом и должна была быть проблема.
Вот тут дали развернутый ответ: http://qt-project.org/forums/viewthread/29549/
Но проблема осталась, даже когда абсолютно все создано в потоке...
Алексей1153
как вариант - сериализировать QImage в файл, затем запустить вспомогательный процесс, который этот файл распечатает. Грабли, конечно. Вообще, эта заморочка Qt с зависимостью GUI от потока напрягает...
RazrFalcon
:lol:
уже так и реализовал, походу нормально печатать в потоке в qt нельзя, увы...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.