Russian Qt Forum
Май 03, 2024, 17:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Создание накладной средствами Qt  (Прочитано 41916 раз)
phpCoder
Гость
« Ответ #15 : Август 11, 2015, 22:54 »

Чудно получается, как может что-то кешироваться, если объект, который кеширует - уже уничтожен?
Записан
Bepec
Гость
« Ответ #16 : Август 12, 2015, 02:03 »

Сетевые настройки глобальные как бы... Вы наверно в курсе, что динамические объекты могут обращаться к глобальным настройкам и уж скорее всего хранилище всей этой лабуды если и не глобально, то как минимум находится в каком то стандартном месте. (версия что всё держится в памяти мне не импонирует, скорее уж темповский каталог)

PS тем более как я уже и отписал это лишь предположение, полученное методом дедукции и основанное на опыте Веселый
Записан
phpCoder
Гость
« Ответ #17 : Август 12, 2015, 08:13 »

Да, Вы были правы.
Использовал стат. метод:
Код:
QWebSettings::clearMemoryCaches();
и печать повторная появилась. Но, т.к. это дело глобальное, то может можно очищать не весь кеш целиком, а только то, что было создано для печати? Не знаете? Т.е. указать путь к временным данным и удалить их.
Записан
Bepec
Гость
« Ответ #18 : Август 12, 2015, 12:02 »

Проще отключить кеширование, там настроечка вроде есть. Да и на мой взгляд разницы в очищении кеша и в очищении одной накладной не будет. Хотя тут уже  зависит от того, используется ли у вас webView и так далее.

PS как вариант сделайте асинхронную печать, тогда проблема кеша не будет стоять. (не используйте QEventLoop в функции, а просто сделайте класс, который не будет зависеть от скорости подачи сигнала)
« Последнее редактирование: Август 12, 2015, 12:15 от Bepec » Записан
phpCoder
Гость
« Ответ #19 : Август 12, 2015, 20:10 »

Т.е. в этом мини классе создать приватный слот печати, и соединить его через loadFinished?

Хм, может тогда сделать анонима, и его подсоединить? Тогда никаких классов делать не надо.
Записан
phpCoder
Гость
« Ответ #20 : Август 12, 2015, 23:12 »

Код
C++ (Qt)
...
QPrinter *printer = new QPrinter;
printer->setColorMode(QPrinter::GrayScale);
printer->setOutputFormat(QPrinter::PdfFormat);
printer->setOutputFileName(this->_invoiceFilepath());
QWebPage *page = new QWebPage(this);
connect(page, &QWebPage::loadFinished, this, [&] ()
{
    page->
             mainFrame()->
             print(
                   printer); // СИГа
});
page->mainFrame()->setHtml(html);
Там где комментарий он предъявляет SIGSEGV. Почему? Страница существует, т.к. указатель. Принтер существует, т.к. указатель. Указатели после завершения функции намеренно не стираю.

Если всю эту лабуду переписать не с анонимом, а с обычным слотом, то все нормально.
« Последнее редактирование: Август 12, 2015, 23:14 от phpCoder » Записан
phpCoder
Гость
« Ответ #21 : Август 12, 2015, 23:34 »

Все, добил.
Код
C++ (Qt)
QWebPage *page = new QWebPage(this);
connect(page, &QWebPage::loadFinished, this, [this] ()
{
QPrinter printer;
printer.setColorMode(QPrinter::GrayScale);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(this->_invoiceFilepath());
qobject_cast<QWebPage*>(this->sender())->mainFrame()->print(&printer);
this->sender()->deleteLater();
});
page->mainFrame()->setHtml(html);

Указатель на страницу нужен, чтобы распечаталась картинка. Если его не будет, то вместо картинки будет иконка битого изображения.
Указатель ловить не надо. Надо использовать sender(). Иначе программа убъется.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.093 секунд. Запросов: 21.