Russian Qt Forum
Августа 26, 2025, 19:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Масштабирование html а-ля Word в Qt  (Прочитано 7367 раз)
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) не достаточно.
« Последнее редактирование: Января 13, 2008, 15:14 от Andrey_hello » Записан
Mikor
Гость
« Ответ #1 : Января 13, 2008, 16:18 »

Если комп быстрый, можно рисовать то, что 100% масштабом в QBitmap (у виджета вроде есть функция визуализации на отдельный QPaintDevice). А потом этот QBitmap resize в любой нужный размер. Правда текст будет чуток расплываться (при большом уменьшении лучше будет чтобы исходный текст был стиля Bold)
Записан
Andrey_hello
Гость
« Ответ #2 : Января 13, 2008, 18:44 »

Не совсем понял. Текст должен не быть картинкой, а поддерживать работу с ним, я устанавливаю текст (html) в QTextBrowser методом setText() (QTextEdit).

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

Рисовать я пробовал, как уже писал на QCanvas и QPainter - и так и так html не распознается.
Записан
_govorilka
Гость
« Ответ #3 : Января 14, 2008, 10:27 »

Посмотри исходники ассистента, там подобное реализовано. Вообще, если текст не слишком сложный (как на скринах). Проще собственный редактор замутить (например, через QGraphicsView), чем мучится с QTextBrowser/QTextEdit
Записан
Andrey_hello
Гость
« Ответ #4 : Января 14, 2008, 19:52 »

QGraphicsView нет в Qt3.
Записан
_govorilka
Гость
« Ответ #5 : Января 17, 2008, 07:09 »

Извини, не посмотрел на версию библиотеки...
Записан
Andrey_hello
Гость
« Ответ #6 : Января 18, 2008, 19:21 »

Все доделал кроме масштабирования непосредственно текста.

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

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

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

Попробую перегруженные функции, с параметром, но сомневаюсь в улучшении результата.
Записан
_govorilka
Гость
« Ответ #7 : Января 18, 2008, 21:07 »

Мне почему-то, кажется, что проблема у тебя со шрифтами. Если есть возможность переходи на 4.x.x, систему рисования передали полностью и она стала заметно меньше косяков давать.
« Последнее редактирование: Января 18, 2008, 21:09 от _govorilka » Записан
BaltikS
Гость
« Ответ #8 : Января 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 я думаю тебе не составит труда  Подмигивающий
Удачи!
Записан
Andrey_hello
Гость
« Ответ #9 : Января 19, 2008, 14:42 »

Спасибо, попробую. Позволит ли ещё Canvas работать с нарисованным текстом, вот в чем вопрос. Если нет (как я понимаю Canvas это всего лишь рисовалка), то наверное масштабирование сделать типа "предварительный просмотр" на Canvas, а работу с документом на TextBrowser с ограниченным масштабированием и так будет чудесно, т. к. раньше документ отображался безразмерный и вид зависел от размера рабочей области как в "Блокнот".

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

Шрифты от меня не должны зависеть, шрифты должны быть такие, как указал автор HTML-а, попробую побаловаться шрифтами тоже.
« Последнее редактирование: Января 19, 2008, 14:50 от Andrey_hello » Записан
Andrey_hello
Гость
« Ответ #10 : Января 21, 2008, 18:22 »

Функции zoomIn или Out с параметром (в частности ставлю цифру 2) работают покорректнее, получилось 8 шагов увеличение и 6 шагов уменьшение, с корректным возвращением к первоначальному размеру, что соответствует примерно от 33% до 200%, под каждый шаг подобрал этот процент, т. е. сделал "+" и "-" и обращение к + и - через Ctrl + колесо мыши, визуально неравномерность шагов не заметна.

Конечно далеко не идеал, но другого, кроме zoomIn() и zoomOut() для QTextBrowser-а не знаю.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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