Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Andrey_hello от Января 13, 2008, 15:07



Название: Масштабирование html а-ля Word в Qt
Отправлено: Andrey_hello от Января 13, 2008, 15:07
Здравствуйте. Появилась проблема, поиск не помог.
Библиотека Qt 3.3.4
Написал классы для работы со страницами документа, браузер наследует QScrollView, класс страницы размещаемой в браузере - QTextBrowser.

На главной форме размещается QComboBox по типу как в Word 500%, 200%, 100, 50 и т. д. Страницы размеры изменяют (resize), на ScrollView перераспределяются, а вот как масштабировать содержимое (html) - не представляю. Методы zoomIn() и zoomOut() для масштабирования хотябы с шагом 10% не подходят - все происходит довольно коряво.

Если не найду решение придется подгонять величину масштаба под результат этих функций и написать ближайшее целое, но при таком решении о нормальном масштабировании придется забыть.

Да и еще какойто косяк у методов - после zoomIn() результат zoomOut() (и наоборот) может не всегда возвращать первоначальный вид страницы.

Прикреплю картинку - mainWindow, но это не проект, а сделано для тестирования моего браузера страниц.

Попробовал добавлять текст в QCanvas (QCanvasText), рисовать текст QPainter-ом (drawText) - и там и там не поддерживают HTML. Может кроме просто добавления текста надо еще что с текстом или объектом, содержащим текст сотворить? QCanvas-ом можно масштабировать хорошо, но текста в виде картинки для работы (которую предоставляет QTextBrowser) не достаточно.


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: Mikor от Января 13, 2008, 16:18
Если комп быстрый, можно рисовать то, что 100% масштабом в QBitmap (у виджета вроде есть функция визуализации на отдельный QPaintDevice). А потом этот QBitmap resize в любой нужный размер. Правда текст будет чуток расплываться (при большом уменьшении лучше будет чтобы исходный текст был стиля Bold)


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: Andrey_hello от Января 13, 2008, 18:44
Не совсем понял. Текст должен не быть картинкой, а поддерживать работу с ним, я устанавливаю текст (html) в QTextBrowser методом setText() (QTextEdit).

Кроме того QWidget не наследует QBitmap, а идет параллельной веткой иерархии наследования, поясни пожалуйст, что имелось в виду, как использовать QBitmap.

Рисовать я пробовал, как уже писал на QCanvas и QPainter - и так и так html не распознается.


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: _govorilka от Января 14, 2008, 10:27
Посмотри исходники ассистента, там подобное реализовано. Вообще, если текст не слишком сложный (как на скринах). Проще собственный редактор замутить (например, через QGraphicsView), чем мучится с QTextBrowser/QTextEdit


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: Andrey_hello от Января 14, 2008, 19:52
QGraphicsView нет в Qt3.


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: _govorilka от Января 17, 2008, 07:09
Извини, не посмотрел на версию библиотеки...


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: Andrey_hello от Января 18, 2008, 19:21
Все доделал кроме масштабирования непосредственно текста.

В ассистенте ничего хитрого нет, вот код:

void TabbedBrowser::zoomIn()
{
    currentBrowser()->zoomIn();
}

Косяки я понял (но не как их устранить), под Windows функции zoomIn() и zoomOut() работают хорошо, но когда я свои классы и запускалку компилю под нашу МСВС (Линукс), эти функции кочеряжутся, например результат изменения масштаба в одну сторону не соответствует изменению масштаба на такое же количество шагов в другую сторону, и ещё, что хуже, при увеличении на некоторое колчество раз, функция уменьшения вообще отказывается работать!

Попробую перегруженные функции, с параметром, но сомневаюсь в улучшении результата.


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: _govorilka от Января 18, 2008, 21:07
Мне почему-то, кажется, что проблема у тебя со шрифтами. Если есть возможность переходи на 4.x.x, систему рисования передали полностью и она стала заметно меньше косяков давать.


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: BaltikS от Января 18, 2008, 23:08
Я делал когда то так, рисовал именно HTML на QCanvasView:
Код:
QSimpleRichText *doc = new QSimpleRichText( text(), font() );
doc->setWidth(cr.width()-4);
doc->draw(painter, 1, 2, cr, cg, 0);
Работало... Ну а смасштабировать QCanvasView я думаю тебе не составит труда  ;)
Удачи!


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: Andrey_hello от Января 19, 2008, 14:42
Спасибо, попробую. Позволит ли ещё Canvas работать с нарисованным текстом, вот в чем вопрос. Если нет (как я понимаю Canvas это всего лишь рисовалка), то наверное масштабирование сделать типа "предварительный просмотр" на Canvas, а работу с документом на TextBrowser с ограниченным масштабированием и так будет чудесно, т. к. раньше документ отображался безразмерный и вид зависел от размера рабочей области как в "Блокнот".

А переход на 4.x.x зависит не от меня, а от организации, я лично высказал предложение писать новые библиотеки на 4.x.x, а поддерживать старое ПО на  3.x.x.

Шрифты от меня не должны зависеть, шрифты должны быть такие, как указал автор HTML-а, попробую побаловаться шрифтами тоже.


Название: Re: Масштабирование html а-ля Word в Qt
Отправлено: Andrey_hello от Января 21, 2008, 18:22
Функции zoomIn или Out с параметром (в частности ставлю цифру 2) работают покорректнее, получилось 8 шагов увеличение и 6 шагов уменьшение, с корректным возвращением к первоначальному размеру, что соответствует примерно от 33% до 200%, под каждый шаг подобрал этот процент, т. е. сделал "+" и "-" и обращение к + и - через Ctrl + колесо мыши, визуально неравномерность шагов не заметна.

Конечно далеко не идеал, но другого, кроме zoomIn() и zoomOut() для QTextBrowser-а не знаю.