Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: itan от Июнь 10, 2009, 09:34



Название: QTextEdit: разнесение текста на 2 страницы
Отправлено: itan от Июнь 10, 2009, 09:34
Существуют 2 файла html, которые необходимо отобразить на 2 разных страницах QTextEdit:
Код:
File file1(htmlFileName1);
if (!file.open(QFile::ReadOnly))
return false;

QFile file2(htmlFileName2);
if (!file2.open(QFile::ReadOnly))
return false;

QTextEdit textEdit(0);

QByteArray data = file1.readAll();
QTextCodec *codec = Qt::codecForHtml(data);
QString str = codec->toUnicode(data);

textEdit.setHtml(str);

data = file2.readAll();
codec = Qt::codecForHtml(data);
str = codec->toUnicode(data);

textEdit.append(str);

Как это можно сделать?


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: spectre71 от Июнь 10, 2009, 09:38
Что значит отобразить на 2-х разных страницах?


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: itan от Июнь 10, 2009, 09:45
Сейчас все 2 файла (таблицы) умещаются на одной странице, друг за другом.
А надо, чтобы: 1-ый файл (таблица) на 1-ой странице, 2-ой файл (тоже таблица) на 2-ой странице.


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: spectre71 от Июнь 10, 2009, 09:51
Используй QTabWidget


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: itan от Июнь 10, 2009, 09:56
Вообще-то я все это дальше на печать вывожу:
Код:
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog prv(&printer, &textEdit);
connect(&prv, SIGNAL(paintRequested(QPrinter *)), &textEdit, SLOT(print(QPrinter *)));

Думаю тут надо смотреть в сторону QTextDocument и QTextCursor, только вот там нет метода типа "начало новой страницы"


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: spectre71 от Июнь 10, 2009, 10:03
Опиши свою задачу подробнo, по шагам.


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: itan от Июнь 10, 2009, 10:10
Имеется модуль создания отчетов:
1. Каждый элемент отчета (таблица, график, диаграмма и т.д.) генерируется в отдельный html файл.
2. Для лучшего восприятия на PrintPreview хотелось бы отображать каждый элемент отчета (html файл) начиная с новой страницы.
3. Далее на печать.


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: spectre71 от Июнь 10, 2009, 10:38
QPrinter::newPage()


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: spectre71 от Июнь 10, 2009, 10:51
Вообще-то я все это дальше на печать вывожу:
Код:
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog prv(&printer, &textEdit);
connect(&prv, SIGNAL(paintRequested(QPrinter *)), &textEdit, SLOT(print(QPrinter *)));

Думаю тут надо смотреть в сторону QTextDocument и QTextCursor, только вот там нет метода типа "начало новой страницы"

connect(&prv, SIGNAL(paintRequested(QPrinter *)), &textEdit, SLOT(print(QPrinter *)));
Что бы это значило!
print - не слот


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: itan от Июнь 10, 2009, 11:18
Ну, да, вот так должно быть:
Код:
class CQTextEdit : public QTextEdit
{
Q_OBJECT
public:
CQTextEdit(QWidget* parent): QTextEdit(parent) {}

private slots:
void print(QPrinter *);
};

void CQTextEdit::print(QPrinter* p)
{
QTextEdit::print(p);
}

СQTextEdit textEdit(0);
....
QPrinter printer(QPrinter::HighResolution);
QPrintPreviewDialog prv(&printer, &textEdit);
connect(&prv, SIGNAL(paintRequested(QPrinter *)), &textEdit, SLOT(print(QPrinter *)));

Но все равно не понятно где использовать QPrinter::newPage()  ?
Я так понимаю нужно переопределять процесс рендеринга QTextEdit ?




Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: spectre71 от Июнь 10, 2009, 11:27
Тебе не нужен QTextEdit - он занимается визуализацией QTextDocument, согласно его текущим размерам, настройкам итд.

Тебе нужен QTextDocument.
void QTextDocument::print ( QPrinter * printer ) const


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: spectre71 от Июнь 10, 2009, 11:47
Код
C++ (Qt)
class CQTextEdit : public QTextEdit
{
Q_OBJECT
public:
CQTextEdit(QWidget* parent): QTextEdit(parent) {}
 
private slots:
void print(QPrinter *);
};
 
void CQTextEdit::print(QPrinter* p)
{
QTextEdit::print(p);
}
 
void MainWindow::on_testButton_clicked()
{
 CQTextEdit* TextEdit = new CQTextEdit(this);
 TextEdit->setHtml(...);
 
 QPrinter printer(QPrinter::HighResolution);                                              
 QPrintPreviewDialog prv(&printer);
 QObject::connect(&prv, SIGNAL(paintRequested(QPrinter *)), TextEdit, SLOT(print(QPrinter *)));
 prv.exec();
}
 
Все отлично разбивается по страницам.


Название: Re: QTextEdit: разнесение текста на 2 страницы
Отправлено: itan от Июнь 10, 2009, 13:07
Получилось! Вот что я хотел на самом деле:
Код
C++ (Qt)
class CQTextEdit : public QTextEdit
{
Q_OBJECT
public:
CQTextEdit(QWidget* parent): QTextEdit(parent) {}
 
private slots:
void print(QPrinter *);
};
 
void CQTextEdit::print(QPrinter* p)
{
QTextEdit::print(p);
}
 
void MainWindow::on_testButton_clicked()
{
 CQTextEdit* textEdit = new CQTextEdit(this);
 
 QTextBlockFormat blockFmt;
 blockFmt.setPageBreakPolicy(QTextFormat::PageBreak_AlwaysBefore);
 QTextCursor cur(textEdit->document());
 cur.insertHtml("<b> First Page </b>");
 cur.insertBlock(blockFmt);
 cur.insertHtml("<b> Second Page </b>");
 cur.insertBlock(blockFmt);
 cur.insertHtml("<b> Third Page </b>");
 
QPrinter printer(QPrinter::HighResolution);                                              
QPrintPreviewDialog prv(&printer);
QObject::connect(&prv, SIGNAL(paintRequested(QPrinter *)), textEdit, SLOT(print(QPrinter *)));
prv.exec();
}