Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt Печать с QPrintPreviewDialog нескольких страниц 
:(
    Опции темы
math64
Дата 14.2.2012, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Делаю печать QSqlTableModel через QWebView с QPrintPreviewDialog. Для каждой строки формируется html-страница, которую нужно напечатать на отдельной странице. Используется QWebView потому, что в QTextEdit html релизован не полностью (например, нельзя настроить рамку таблицы).
Если сделать
Код

    connect(&ppd, SIGNAL(paintRequested(QPrinter*)),
            &webView, SLOT(print(QPrinter*)));

QPrintPreviewDialog покажет только одну страницу и её напечатает.
Как напечатать остальные?
При
Код

void MainWindow::print(QPrinter*printer) // slot
{
    QWebView webView;
    for (int i = 0; i < pages.size(); i++) {
        webView.setHtml(pages[i]); // QStringList pages;
        webView.print(printer);
    }
}

"печать" в preview происходит долго, затем показывается только одна страница.
Можно ли проконтролировать, что один html займет только одну страницу?

PM   Вверх
math64
Дата 15.2.2012, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Если вставить все страницы в один html и разделить их с помощью <p style='page-break-before:always;'/> то печатается правильно, но ожидать появления preview на экране приходится долго.
Если делить с помощью <p style='page-break-after:always;'/> со второй страницы верхнее поле игнорируется.
PM   Вверх
math64
Дата 18.2.2012, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Другой способ печати - вместо html нарисовать форму в редакторе ресурсов.
Код

void MainWindow::print(QPrinter*printer) // slot
{
    QPainter painter;
    painter.begin(printer);
    for(int page=1; page<=pageCount;page++) {
      if(page > 1)
        printer->newPage();
      Ui::Form ui;
      QWidget* widget = new QWidget();
      ui.setupUi(widget);
      // заполнение формы данными для страницы page
      widget->render(&painter);
      delete widget;
    }
    painter.end();
}

+ добавление ProgressDialog при необходимости
Весь процесс печати контролируется, при обрыве печати знаем какаие страницы напечатаны etc.
При этом не нужно самому вычислять все координаты, как при самостоятельном программировании печати.
Внутри QLabel можно использовать ограниченный html - возможностей которого обычно хватает, с учётом того, что можно самостоятельно разместить метку на виджете, а горизонтальные, вертикальны линии и рамки можно рисовать с помощью QFrame.
Но: как вычислить размер виджета, чтобы он по ширине совпадал с шириной страницы (без полей), а по высоте - не превышал?
У меня сейчас размеры виджета 676x741 - чуть меньше, чем нужно по ширине и меньше по высоте (A4).
Зависят ли нужные размеры от принтера, дисплея, операционной системы?
Как отличить печать в Preview или на реальный принтер?
Если в Preview напечатать только одну страницу (в данном случае они все похоже и предпросмотр всех ни к чему), то можно ли будет напечатать на принтер все и сможет ли пользователь выбрать печатаемые страницы?


Это сообщение отредактировал(а) math64 - 18.2.2012, 19:11
PM   Вверх
math64
Дата 22.2.2012, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



При печати с помощью виджета получается следующий недостаток: виджет проектируется под разрешение экрана (96 пикселей на дюйм),
по умолчанию включена двойная буферизация, и картинка на принтере получится размазанной.
Как отключить двойную буферизацию?
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1704 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.