Russian Qt Forum

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



Название: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 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 пиксель?


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: denka от Июль 09, 2009, 11:41
Попробуй QTextTable


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 09, 2009, 11:53
Попробуй QTextTable

QTextTable
QTextTableFormat
QTextTableCell
QTextTableCellFormat

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

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



Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: denka от Июль 09, 2009, 12:02
По идеи так оно и есть


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: ритт от Июль 09, 2009, 15:55
так и должно быть.
нужно устанавливать границы ячеек таблицы - не самой таблицы...а это уже css


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 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 или о стилях линий не нашел. В какую сторону смотреть?


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: ритт от Июль 09, 2009, 20:17
в сторону setStyleSheet


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 09, 2009, 21:06
в сторону setStyleSheet

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

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

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



Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: ритт от Июль 09, 2009, 21:33
для QTextEdit или любого родительского виджета
table td {border-*:...}


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 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 (http://www.htmlbook.ru/content/?id=33)

Подробности по свойству border-collapse - http://www.htmlbook.ru/css/border-collapse.html (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://i.piccy.info/i3/79/ac/8df931ec933ed5b7067543c71b5c.png (http://i.piccy.info/i3/79/ac/8df931ec933ed5b7067543c71b5c.png)

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


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: ритт от Июль 09, 2009, 22:37
неправильно задаёшь стиль + задаёшь неправильный стиль (смотри какие атрибуты border поддерживаются)
почитай документацию по qss


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 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 (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;}"

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

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


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: iamfomik от Июль 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>
думаю это максимум что можно сделать.

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


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 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 пикселей.

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


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: ритт от Июль 12, 2009, 00:58
отправить товарища читать доки по хтмл/цсс

в своё время чтобы не заморачиваться на поведение разных браузеров делал так: у ячеек правую и нижнюю границу устанавливаем в 0, а у таблицы - то же самое для левой и верхней.
такой вариант работает всегда, независимо от качества рендерера (конечно, если цсски поддерживаются)


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: BaltikS от Июль 13, 2009, 06:40
Присоединюсь с вопросами ...
-1 - это действительно помогает :)...
Но для меня остаётся загадкой, как сменить цвет рамки? Задаю bordercolor=#000000, а также через стиль - одна фигня... Всё равно время рамка серая...


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 13, 2009, 11:31
в своё время чтобы не заморачиваться на поведение разных браузеров делал так: у ячеек правую и нижнюю границу устанавливаем в 0, а у таблицы - то же самое для левой и верхней.
такой вариант работает всегда, независимо от качества рендерера (конечно, если цсски поддерживаются)

Блин, я устал читать уже доку и экспериментировать в коде...

Как блин указать что у таблицы или там ячейки нет правой и нижней границы?

<table style="border:solid; border-right:none; border-bottom: none;">
<td style="border:solid; border-right:none; border-bottom: none;">

Вроде в доке упоминается про border-right-style, пробую и так

<table style="border:solid; border-right-style:none; border-bottom-style: none;">
<td style="border:solid; border-right-style:none; border-bottom-style: none;">

и даже так

<table border-right-style="none" border-bottom-style="none">
<td border-right-style="none" border-bottom-style="none">

при вставке таких таблиц все в конечном коде QTextEdit съедается.

Если генерировать таблицу через объекты Qt, то тоже неясно как делать. В QTextTableFormat нет методов или объединений, которые работали бы с определенным краем бордюра, есть просто бордюр и его стиль. В QTextTableCellFormat такая же ситуация.


Название: Re: QTextEdit - Можно ли показать таблицу с тонкими линиями 1px ?
Отправлено: xintrea от Июль 13, 2009, 13:29
Но для меня остаётся загадкой, как сменить цвет рамки? Задаю bordercolor=#000000, а также через стиль - одна фигня... Всё равно время рамка серая...

Да уже подозреваю что никак. Установить цвет фона ячейки можно. А цвет рамки - нет.

Хотя внутри Qt в методах работы с css практически всё есть. Например, в исходниках Qt в css предусмотрена обработка и цвета, и стиля

{ "border-color", BorderColor }
{ "border-left-color", BorderLeftColor }
{ "border-left-style", BorderLeftStyle }
{ "border-right", BorderRight }
{ "border-right-color", BorderRightColor }
{ "border-right-style", BorderRightStyle }
{ "border-style", BorderStyles }

и даже есть методы, например setBorderRightStyle() - видимо, то что мне нужно, чтоб мог установить нужный стиль правой или нижней границы. Но это всё не торчит наружу в апишный интерфейс, а скрыто внутрях Qt.


ЗЫЖ

А вообще попробуй

border-color="#0A0B0C"

именно с тире и именно в двойных кавычках.