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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Отчеты!! Преобразование текста в рисунок  (Прочитано 27622 раз)
crocus
Гость
« Ответ #15 : Январь 27, 2006, 14:20 »

Вышибает, если подряд открыть несколько документов и внимательно надо просмотреть QTextDocument::print, где-то что-то проглядел поэтому и рисует только 1 страницу, да и с границами(размерами) косяк.
Код:
void ImageViewer::preview()
{

    QString fileName = QFileDialog::getOpenFileName(this,
                       tr("Open File"), QDir::currentPath());
    QFile file(fileName);
    QString str;
    if (file.open(QFile::ReadOnly))
    {
        QByteArray data = file.readAll();
        QTextCodec *codec = Qt::codecForHtml(data);
        str = codec->toUnicode(data);
        if (Qt::mightBeRichText(str))
        {
            doc->setHtml(str);
        }
        else
        {
            str = QString::fromLocal8Bit(data);
            doc->setHtml(str);
        }
    }
    file.close();
    QColor color(0xff, 0xff, 0xff);
    QPixmap preview(width(), height());
    QPainter p(&preview);
    p.setPen(color);
    p.fillRect(0, 0, width(), height(), color);
    (void)doc->documentLayout(); // make sure that there is a layout
    // QRectF body = QRectF(QPointF(0, 0), size);
    QPointF pageNumberPos;
    extern int qt_defaultDpi();
    qreal sourceDpiX = qt_defaultDpi();
    qreal sourceDpiY = sourceDpiX;
    QPaintDevice *dev = doc->documentLayout()->paintDevice();
    if (dev)
    {
        sourceDpiX = dev->logicalDpiX();
        sourceDpiY = dev->logicalDpiY();
    }
    // scale to dpi
    // QSizeF scaledPageSize = doc->pageSize;
    //const QSizeF printerPageSize(preview.width(), preview.height());
    QAbstractTextDocumentLayout *layout = doc->documentLayout();
    layout->setPaintDevice(p.device());
    const int dpiy = p.device()->logicalDpiY();
    //const int margin = (int) ((2/2.54)*dpiy); // 2 cm margins
    const int margin = 0;
    QTextFrameFormat fmt = doc->rootFrame()->frameFormat();
    fmt.setMargin(margin);
    doc->rootFrame()->setFrameFormat(fmt);

    QRectF body = QRectF(0, 0, p.device()->width(), p.device()->height());
    pageNumberPos = QPointF(body.width() - margin,
                            body.height() - margin
                            + QFontMetrics(doc->defaultFont(), p.device()).ascent()
                            + 5 * p.device()->logicalDpiY() / 72);

    QFont font(doc->defaultFont());
    font.setPointSize(8); // we define 10pt to be a nice base size for printing
    doc->setDefaultFont(font);
    doc->setPageSize(body.size());
    QRectF view(0, 0, body.width(), body.height());
    QAbstractTextDocumentLayout::PaintContext ctx;
    p.setClipRect(view);
    ctx.clip = view;
    layout->draw(&p,ctx);
    imageLabel->setPixmap(preview);
    scaleFactor = 1.0;
    printAct->setEnabled(true);
    fitToWindowAct->setEnabled(true);
    updateActions();

    if (!fitToWindowAct->isChecked())
        imageLabel->adjustSize();
    delete doc;
Записан
crocus
Гость
« Ответ #16 : Январь 30, 2006, 13:33 »

Не идет вывод всех страниц :evil:

И PDF весь pixmap загоняет в одну страницу :?
Записан
nEoN
Гость
« Ответ #17 : Январь 30, 2006, 15:18 »

Что значит "Не идет вывод всех страниц" ?
Ты пытаешься все страницы документа в один QPixmap вывести ?
Записан
crocus
Гость
« Ответ #18 : Январь 30, 2006, 15:49 »

Нет вывести каждую страницу в свой pixmap наверное не трудно,
не пойму как потом pixmap,ы засунуть в один label?
Связка то идет pixmap-> label -> scrollarea, а у QScrollArea есть только QScrollArea::setWidget, но нет addWidget.
Или я уже куда-то не туда пошел?Непонимающий
Записан
nEoN
Гость
« Ответ #19 : Январь 30, 2006, 16:12 »

Объединить label'ы можно, запихнув в ScrollArea например QFrame, а в него уже label'ы через QVBoxLayout.
Но хранить preview в картинках это не лучшее решение, очень много памяти будет на это расходоваться. Лучше рисовать не в pixmap, а каждый раз в окно preview, при его перерисовке (paintEvent).

Я сам на днях пытался реализовать print preview, в конце концов мне это удалось,  но не получилось до конца решить проблему масштабирования готового preview.
Записан
crocus
Гость
« Ответ #20 : Январь 30, 2006, 17:01 »

Я пробывал запихнуть QFrame в QScrollArea не фига не вышло,
а это вообще реально???, просто QFrame без scrola без проблем, а вносишь его (frame) в scroll нечего неотображается.
Записан
nEoN
Гость
« Ответ #21 : Январь 30, 2006, 17:18 »

Цитата: "crocus"
Я пробывал запихнуть QFrame в QScrollArea не фига не вышло,
а это вообще реально???, просто QFrame без scrola без проблем, а вносишь его (frame) в scroll нечего неотображается.

Попробуй изменить размер QFramе после добавления в QScrollArea :
frame->resize(300, 300);
Записан
crocus
Гость
« Ответ #22 : Январь 31, 2006, 16:45 »

Сделал так
Код:
frame ->resize(width() * 3, height() * 2);

что пожалуй тоже не совсем верно.
И еще, что значит-

Лучше рисовать не в pixmap, а каждый раз в окно preview, при его перерисовке (paintEvent).
Записан
nEoN
Гость
« Ответ #23 : Февраль 01, 2006, 00:27 »

Цитата: "crocus"
Добавил
Код:
scrollArea->setWidgetResizable(true);
и resize не требуется.
Но новый косяк исчезли ScrolBar,ы

Скроллбары какраз из за setWidgetResizable изчезли, т.к. ScrollArea теперь автоматически подгоняет размеры починённого фрейма под свои. Сделай вместо этого resize.

Цитата: "crocus"
И еще, что значит-
Лучше рисовать не в pixmap, а каждый раз в окно preview, при его перерисовке (paintEvent).

Имеется ввиду обойтись без всяких QPixmap и QLabel. В место этого в качестве preview будет один QWidget (помещённый в QScrollArea) с переопределённым методом paintEvent(). В paintEvent происходит отрисовка страниц (preview page) или части страниц, которые попадают в область перерисовки.

Я сегодня вечером или завтра постараюсь выложить свой вариант PrintPreview, там именно так реализовано.

добавлено спустя 6 часов 49 минут:

 
Вот моя реализация Print preview QTextDocument'a.
Вариант ещё не до конца закончен, но думаю будет интересен.
(ссылки ниже)



Исходники [10KB] http://alexbirk.narod.ru/source/printpreview/printpreview.zip
Исполняемый файл [17KB] (требуется Qt4.1.0) http://alexbirk.narod.ru/source/printpreview/printpreview.exe.zip
Записан
crocus
Гость
« Ответ #24 : Февраль 07, 2006, 09:25 »

Цитировать
to nEoN

Собрал на MinGW, сначала поругалось на "friend", что-то сделал - скомпилировалось. Все прикольно, в принципе что и требовалось, только не понял??? При отправке на печать ничего не выводится (те печать не происходит) и кого вообще отправляем на печать,
Код:

{
m_printer->setFullPage(true);
QPrintDialog dlg(m_printer, this);
if (dlg.exec() != QDialog::Accepted)
return;
}
m_printer->setFromTo(1, 1);

m_preview->setDocument(ui.textEdit->document());
m_preview->updatePreview();
updateScaleEdit();

Это баг или чтоб жизнь медом не казалась, :lol:
Типа додумывайте сами!!!
Записан
nEoN
Гость
« Ответ #25 : Февраль 07, 2006, 09:41 »

Печати там нет, только preview :-)
При нажатии на кнопку "Preview" вылезает окно настройки печати. Это сделано для того, чтобы можно было наблюдать, как Preview реагирует на различные настройки печати/принтера.
А саму печать приделать пара пустяков ;-)
Записан
Steven_Orko
Гость
« Ответ #26 : Февраль 07, 2006, 19:57 »

Скачал указанный выше пример с "Исходники [10KB] http://alexbirk.narod.ru/source/printpreview/printpreview.zip".
Сходу распаковал в папку, соответствующую названию PRO-файла и открыл в MS VS2005.
Выбрал Build->Batch Build->Select All->Rebuild. Создалось два файла: как вы догадываетесь, Release и Debug.
Запускаю оба файла - работают без проблем. Компиляция тоже прошла без проблем.

ОГРОМНОЕ СПАСИБО nEoN!!!!
Мне это тоже пригодилось при созданиии моего рабочего проекта.
Записан
crocus
Гость
« Ответ #27 : Февраль 13, 2006, 17:56 »

Цитата: "nEoN"

А саму печать приделать пара пустяков ;-)

Ну не догоняю Грустный
Код:
m_preview->paintTo(m_printer);

Печатает,  но не то что отображает, и перерисовка дважды происходит.
Раз отправил, перерисовала-распечатала, второй -тоже самое, ну и далее без перерисовки печатает.
Записан
Alikus
Гость
« Ответ #28 : Апрель 03, 2006, 01:58 »

У меня такой нескромный вопросик к знающим людям.
Скажите, а можно ли реализовать подобное что сделал nEoN используя библиотеку Qt-3.3.3?

Дело в том что у нас на работе ПС "Конструктор" (я думаю слышали об этом уродце) основан именно на этой версии Qt. И как бы все прекрасные весчи Qt4 отпадают Грустный

Мне тоже нужно организовать предварительный просмотр текста. Пишу нечто вроде текстового редактора. Я в общем пытался как-то выводить  содержимое художника на QFrame. Но у меня видимо что-то не то было с метриками фрейма или что еще. Кароче с маштабом проблема выходила. Ребят! Подскажите пожалуйста или направьте в нужное русло. Проскальзывал здесь вариант вывода на экран или в пиксмап, но я не совсем понял как именно это реализовать.
Записан
nEoN
Гость
« Ответ #29 : Апрель 03, 2006, 09:00 »

В Qt3 думаю реально сделать подобное.
Советую посмотреть исходники процесса печати Qt Assistant, а именно метод MainWindow::print()
(файл: Qt\3.3.4\tools\assistant\mainwindow.ui.h).

Для предварительного просмотра нужно сделать похожим образом, только рисовать не на принтере, а на виджете. А для изменения масштаба надо менять метрики этого виджета (как именно в Qt3, я не разбирался).
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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