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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?  (Прочитано 15412 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Июль 09, 2009, 11:32 »

Здравствуйте!


Столкнулся с такой проблемой.

Мне нужно показать таблицу в QTextEdit, чтобы она была оформлена тонкими линиями толщиной 1px. Я оформляю таблицу так

Код:
<table border="1" cellspacing="0" cellpadding="0">

и в результате таблица рисуется линиями, толщиной 2 пикселя, а некоторые вертикальные линии при разном размере QTextEdit разъежжаются на 3 пикселя (посередине линии появляется светлая линия толщиной 1 пиксель). Меня это очень не радует.

Я, конечно, попробовал указать стили таблицы, которые в любом браузере показывают ровную таблицу с толщиной линии 1 пиксель. Но судя по документации, QTextEdit такие свойства стилей не поддерживает

Код:
<table style="border-collapse:collapse; border:solid" border="1" cellspacing="0" cellpadding="0">


Вопрос.

Есть ли возможность отобразить в QTextEdit обычную ровную таблицу с толщиной линий в 1 пиксель?
Записан

Собираю информацию по крупицам
http://webhamster.ru
denka
Гость
« Ответ #1 : Июль 09, 2009, 11:41 »

Попробуй QTextTable
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #2 : Июль 09, 2009, 11:53 »

Попробуй QTextTable

QTextTable
QTextTableFormat
QTextTableCell
QTextTableCellFormat

Нигде настроек вида и толщины линии нет.

Или имеете в виду, что настройка возможна через унаследованные методы QTextFrameFormat ?

Записан

Собираю информацию по крупицам
http://webhamster.ru
denka
Гость
« Ответ #3 : Июль 09, 2009, 12:02 »

По идеи так оно и есть
Записан
ритт
Гость
« Ответ #4 : Июль 09, 2009, 15:55 »

так и должно быть.
нужно устанавливать границы ячеек таблицы - не самой таблицы...а это уже css
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #5 : Июль 09, 2009, 19:16 »

так и должно быть.
нужно устанавливать границы ячеек таблицы - не самой таблицы...а это уже css

Ну, я попробовал конструировать таблицу не напрямую, а функциями Qt. Эффект тот же самый - некоторые линии толще, некоторые тоньше, разброс - 1-3pix при разном размере QTextEdit. Конструирую так

Код:
 QTextLength table_width_in_percent(QTextLength::PercentageLength,table_width);

 QTextTableFormat table_format;
 table_format.setWidth(table_width_in_percent);
 table_format.setAlignment(Qt::AlignHCenter);
 table_format.setBorder(1);
 table_format.setBorderStyle(QTextFrameFormat::BorderStyle_Solid);
 table_format.setPadding(0);
 table_format.setCellPadding(0);
 table_format.setCellSpacing(0);
 QTextTable *table=textarea->textCursor().insertTable(table_hnum, table_vnum, table_format);

В объектах QTextTableCell и QTextTableCellFormat никаких упоминаний о CSS или о стилях линий не нашел. В какую сторону смотреть?
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #6 : Июль 09, 2009, 20:17 »

в сторону setStyleSheet
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #7 : Июль 09, 2009, 21:06 »

в сторону setStyleSheet

Блин, какая-то тема сложная. Нигде толком по-русски не написано, к чему можно применять setStyleSheet(). Создается впечатление, что только к виджетам, не к любым объектам Qt. То есть, этого метода не нашел ни у QTextDocument, ни у QTextTable, ни у QTextTableCell. Зато он есть  у QTextEdit.

Но тогда непонятно, будет ли установка свойства для QTextEdit влиять на таблицу внутри QTextEdit. Походу  может повлиять только на внешний вид самого виджета QTextEdit.

Поясните точнее, для какого объекта нужно устанавливать setStyleSheet() для получения корректного отображения таблицы?

Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #8 : Июль 09, 2009, 21:33 »

для QTextEdit или любого родительского виджета
table td {border-*:...}
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #9 : Июль 09, 2009, 22:13 »

для QTextEdit или любого родительского виджета
table td {border-*:...}

Ну вот смотри, мне нужно установить свойство "border-collapse:collapse" не для td, а для table. Потому что

Цитировать
"Чтобы получить рамку одного вида, рекомендуется воспользоваться стилевым атрибутом border, применяя его к ячейкам таблицы (тегу <TD> или <TH>). Однако и здесь нас подстерегают подводные камни. Поскольку рамка создается для каждой ячейки, то в местах соприкосновения ячеек получается граница удвоенной толщины. Для решения указанной особенности существует несколько путей. Самый простой — воспользоваться свойством border-collapse со значением collapse. В его задачу входит отслеживать соприкосновение линий и вместо двойной границы изображать одинарную. Этот атрибут достаточно добавить к тегу <TABLE>"
http://www.htmlbook.ru/content/?id=33

Подробности по свойству border-collapse - http://www.htmlbook.ru/css/border-collapse.html. Как видно, оно было введено еще в CSS1, и даже самые древние браузеры его держат.

Я делаю так. У меня используется объект, унаследованный от QTextEdit. В его конструкторе пишу

Код:
this->setStyleSheet("table {border-collapse:collapse; border:solid;}");

и по-идее все таблицы внутри него должны отображаться правильно, если написано <table border="1" cellspacing="0" cellpadding="0">, то линии у таблицы должны быть точно толщины 1 pix, не 2 и не 3. А сейчас я наблюдаю гуляния толщины.


http://i.piccy.info/i3/79/ac/8df931ec933ed5b7067543c71b5c.png

Вопрос - что делаю не так?
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #10 : Июль 09, 2009, 22:37 »

неправильно задаёшь стиль + задаёшь неправильный стиль (смотри какие атрибуты border поддерживаются)
почитай документацию по qss
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #11 : Июль 10, 2009, 13:59 »

неправильно задаёшь стиль + задаёшь неправильный стиль (смотри какие атрибуты border поддерживаются)
почитай документацию по qss

1. Ну вот читаю её и непонимаю.

С одной стороны там написано, что поддерживаюся ограниченные элементы, и перечисляются какие. С другой стороны написано, что полностью поддерживается спецификация CSS2, и даже ссылка на офицальный сайт дана.

Qt Style Sheets support all the selectors defined in CSS2.
http://www.w3.org/TR/REC-CSS2/selector.html#q1

С третьей стороны, если поддерживается CSS2, то элемент border-collapse тоже должен поддерживаться, так как введен был еще в CSS1.


2. Если атрибут border-collapse не поддерживатеся, и CSS2 поддерживатеся только в объеме CSS1, значит в QTextEdit невозможно отобразить ровные таблицы с разделительными линиями в 1 pix ?


3. Какую строку стиля надо использовать для применения стиля к таблицам внутри QTextEdit?

Я пробую, например, так

Код:
"QTextEdit::table {border:1px solid maroon;}"

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

Видимо, селектор не тот. Но какой нужен то?
Записан

Собираю информацию по крупицам
http://webhamster.ru
iamfomik
Гость
« Ответ #12 : Июль 11, 2009, 00:55 »

Я тоже бился над этой ПРОБЛЕМОЙ. Перерыв доки, я понял что ничего не поделать - ни стилями ничем другим тонкие таблички не сделать. Я использую для таблиц параметры, которые использует QT для преобразования RTF текста из текстового процессора:

- написал программку с использование QTextEdit'а
- создал таблицу в OpenOffice(можно и в MS - разницы никакой_
- скопировал текст и таблицу в буфер обмена
- вставил в QTextEdit
- использовал метод toHtml() класса QTextEditчтобы получить код

получилась ровная, немного расплывчатая рамка в несколько пикселей. Код таблицы примерно такой:
Код
HTML
<table border="1" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" width="100%" cellspacing="0" cellpadding="4"><thead>
думаю это максимум что можно сделать.

Если кто-то всё-таки как-то извернулся и сумел вставить нормальные рамки, то хорошо бы знать как.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #13 : Июль 11, 2009, 21:46 »

получилась ровная, немного расплывчатая рамка в несколько пикселей. Код таблицы примерно такой:
Код
HTML
<table border="1" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px;" width="100%" cellspacing="0" cellpadding="4">
думаю это максимум что можно сделать.

Если кто-то всё-таки как-то извернулся и сумел вставить нормальные рамки, то хорошо бы знать как.

Да, видимо все дело в кривоватом рендере, ибо в PrintPreview наблюдаю такой же эффект.

Тут еще один товарищ использует вот такой выкрутас

Код:
<table border="1" style="border-style:solid" cellspacing="-1" cellpadding="0">

Я проверил - линии действительно тонкие, ровные, в 1 пиксель... Правда не все. Некоторые вертикальные имеют толщину 2 пикселя. Но это лучше, чем разбрас от 1 до 3 пикселей.

Вообще товарищ говорит, что такое "плавание" размеров происходит из-за задания ширины таблицы в процентах. Если задавать ширину в пикселях, причем выбирать не произвольную ширину, а ширину с учетом того, что ширина таблицы вместе с шириной колонок, толщиной линий уложится в кратное число пикселей, то таблица получится ровной. Но такой изврат никого не радует.
Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #14 : Июль 12, 2009, 00:58 »

отправить товарища читать доки по хтмл/цсс

в своё время чтобы не заморачиваться на поведение разных браузеров делал так: у ячеек правую и нижнюю границу устанавливаем в 0, а у таблицы - то же самое для левой и верхней.
такой вариант работает всегда, независимо от качества рендерера (конечно, если цсски поддерживаются)
« Последнее редактирование: Июль 12, 2009, 01:01 от Константин » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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