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

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

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

Есть необходимость преобразовать текст.
Взял стандартный пример widgets/imageviewer внес изменения
Код:

QPixmap canvas(width(), height());
QPainter p;
p.begin(&canvas);
p.setPen(Qt::blue);
p.drawText(0, 0, QString(text));
p.end();
imageLabel->setPixmap(canvas);

и получаю черный экран.
Версия 4.1
Заработало так:
Код:

void ImageViewer::open()
{
    QString fileName = QFileDialog::getOpenFileName(this,
                       tr("Open File"), QDir::currentPath());

    QFile file(fileName);
   if (!file.open( QFile::ReadOnly | QFile::Text))
    {
        QMessageBox::information(this, tr("HTTP"),
                                 tr("Unable to open the file %1: %2.")
                                 .arg(fileName).arg(file.errorString()));

    }

    QByteArray data = file.readAll();
    QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
    QString str = codec->toUnicode(data);
    file.close();
    QString text = str;
    QPixmap canvas(800, 600);
    QPainter p(&canvas);
    QColor color(0xff, 0xff, 0xff);
    QFont serifFont("MS Shell Dlg", 10);
    p.begin(&canvas);
    p.setPen(color);
    p.fillRect(0, 0, 800, 600, color);
    p.setFont(serifFont);
    for (int i = 0; i < text.size(); ++i)
    {
        //color.setHsv(255, 255, 255);
        QColor color(0, 0, 0);
        p.setPen(color);
        p.drawText(10, 20, QString(text));
    }
    p.end();

    imageLabel->setPixmap(canvas);

............
но косяк текст идет спошняком без переноса по строчкам, хотя
QFile::Text присутствует.

[MODERATOR]
Уважаемые форумчане! НЕ бойтесь пользоватся тегом code. Он не кусается и читать удобнее.
[/MODERATOR]
Записан
BaltikS
Гость
« Ответ #1 : Январь 22, 2006, 11:15 »

2crocus... Какая версия QT?
Записан
crocus
Гость
« Ответ #2 : Январь 22, 2006, 18:08 »

Объясню зачем мне это нужно.
Выбираю данные из БД пользую модель, сортирую, ставлю фильтры
и создаю file.htm(обычная таблица), а далее её (таблицу) необходимо распечатать, предварительно просмотрев, зачем смотреть??? если можно и так отформатировав  распечатать, да наглядно это!!!
а если дорисовать колонтитулы заголовки и т.д. то получится вполне полноценный отчет.
Почему не использую openrpt, ncreport, recall, openRTK??
все эти системы написаны на Qt3  а портировать весь их функционал
нет ни времени, ни желания, ни знаний!!!
Так что если есть схожие с моими проблемы, добро пожаловать устроим brainstorm.
Записан
Dendy
Гость
« Ответ #3 : Январь 23, 2006, 10:22 »

Странно как-то рисовать один и тот же текст несколько раз на одном месте.
А проблема твоя в том, что немного не с той точки начинаешь рисовать.

Код:
p.drawText( x, y, text );


x, y - начинает рисовать с базовой линии шрифта и вверх. Так что начиная рисовать с точки (0,0) увидишь разве что загогулиньІ от букв вверху екрана. ЧтобьІ увидеть весь текст нужно хотя бьІ так:

Код:
p.drawText( 0, QFontMetrics( p.font() ).ascent(), text );
Записан
crocus
Гость
« Ответ #4 : Январь 23, 2006, 12:41 »

Пардон за не слишком читаемый код, но критику принимаю конструктивную, здесь уже рисует построчно при наличии \n,
но хотелось бы чтоб рисовал форматированный HTML, предполагаю
что нужно использовать QRect связав с QTextDocument,  но не понятно как.

Код:

void ImageViewer::open()
{
    QString fileName = QFileDialog::getOpenFileName(this,
                       tr("Open File"), QDir::currentPath());

    QFile file(fileName);
    QString text;
    QTextStream stream(&file);


    QPixmap canvas(width(), height());
    QPainter p(&canvas);
    QColor color(0xff, 0xff, 0xff);
    QFont serifFont("MS Shell Dlg", 8);
    p.begin(&canvas);
    p.setPen(color);
    p.fillRect(0, 0, width(), height(), color);
    p.setFont(serifFont);
    if (file.open( QFile::ReadOnly | QFile::Text))
    {
     QString line;
        int k = 1;
        while ( !stream.atEnd() ) {
            line = stream.readLine(); // line of text excluding '\n'
            qDebug() << k++ << line;
            //text += line;
            for (int i = 0; i < line.size(); ++i)
    {
        //color.setHsv(255, 255, 255);
        QColor color(0, 0, 0);
        p.setPen(color);
        p.drawText(10, (k-1)*20, QString(line));
    }
        }
    }
     else
    {
    QMessageBox::information(this, tr("HTTP"),
                                 tr("Unable to open the file %1: %2.")
                                 .arg(fileName).arg(file.errorString()));
    }
    QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
    file.close();

    p.end();

    imageLabel->setPixmap(canvas);

Большое спасибо BaltikS использовался также и твой код.
Записан
BaltikS
Гость
« Ответ #5 : Январь 23, 2006, 13:21 »

Цитировать
Большое спасибо BaltikS использовался также и твой код.
...
Конечно незачто  :lol: .... Только я кода не писал!
Записан
crocus
Гость
« Ответ #6 : Январь 23, 2006, 13:28 »

Не скромничай
http://prog.org.ru/forum/htopic_2051_%D4%C5%CB%D3%D4%CF%D7%CF%C7%CF+%C6%C1%CA%CC%C1.html
И кстати мой текст для теста состоит из 39 сторок,  на Р4-2.8 рисуется
около 15 с.- долго неправдали.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Январь 23, 2006, 14:54 »

В 3-й было что-то типа QRichTextPainter, вроде бы (название точно не помню), который как раз это и делал...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
crocus
Гость
« Ответ #8 : Январь 23, 2006, 15:07 »

Да и у Бланшет есть примеры,
но из четверки этот класс убрали в Q3Support, ближайший по смыслу
QTextDocument,  вот я спрашиваю как его связать с QRect.
Записан
nEoN
Гость
« Ответ #9 : Январь 23, 2006, 15:42 »

2 crocus
Если у тебя формируется простейший HTML, то чем тебе QTextEdit для просмотра HTML не подходит ?
Записан
crocus
Гость
« Ответ #10 : Январь 23, 2006, 16:16 »

Для просмотра он вполне подходит, да только это не превью, что называется попробуй распечатай -у меня таблица в страницу не влазит, в идеале хотелось бы как предварительный просмотр в Mozille Firefox.
Записан
nEoN
Гость
« Ответ #11 : Январь 23, 2006, 16:43 »

Цитата: "crocus"
Для просмотра он вполне подходит, да только это не превью, что называется попробуй распечатай -у меня таблица в страницу не влазит, в идеале хотелось бы как предварительный просмотр в Mozille Firefox.

Если хочешь чтоб выглядело так, как будет напечатано, то советую посмотреть исходники метода QTextDocument::print(...). Можно сделать похожим образом, но вместо принтера выводить на экран или в память (pixmap).
Записан
crocus
Гость
« Ответ #12 : Январь 25, 2006, 08:36 »

Хотел удалить топик
Записан
nEoN
Гость
« Ответ #13 : Январь 25, 2006, 09:13 »

Q_D(QTextDocument) это макрос, который объявляет локальную переменную d как указатель на внутренние данные документа:
Код:
Q_D(QTextDocument) --> QTextDocumentPrivate* const d = d_func();


Не совсем понятно что и с чём ты пытаешься связать, и зачем тебе содержимое конструкора QTextDocument.
Записан
crocus
Гость
« Ответ #14 : Январь 26, 2006, 08:27 »

А при печати в PDF можно ли представлять альбомом, а не портретом
Код:

QPrinter printer(QPrinter::HighResolution);
    printer.setOrientation(QPrinter::Landscape);
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setOutputFileName(fileName);
    QPainter painter(&printer);
        QRect rect = painter.viewport();
        QSize size = imageLabel->pixmap()->size();
        size.scale(rect.size(), Qt::KeepAspectRatio);
        painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
        painter.setWindow(imageLabel->pixmap()->rect());
        painter.drawPixmap(0, 0, *imageLabel->pixmap());

С этим все равно просматривается портретом, только вписывает правильно, а если убрать
Код:
printer.setOrientation(QPrinter::Landscape);
обрезает рисунок.
И еще- с помощью QTextDocument::print() и плясок с бубном удалось
правильно отображать(рисовать) HTML-код, только с количеством страниц и отображением со 2-й и далее пока непонятно.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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