![]() |
|
![]() ![]() ![]() |
|
KL7 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
Для определенных задумок необходим аналог QLineEdit, но с полным контролем горизонтального расположения текста...
Будем считать что надо реализовать нециклическую бегущую строку (прям как в новостях ![]() Анимационная составляющая мне кажется не проблемой (освоюсь с таймерами и справлюсь наверно), но проблема в том, что мне нужно плавное движение текста, т.е. возможность при необходимости передвинуть текст скажем на 1px... Так же необходима грамотная обработка виджета справа и слева, т.е. как же будут появляться и исчезать символы, после того, как они появились в видимой области или покинули ее... Как ето можно реализовать? Идеи у меня есть, но пока они слишком абстрактны... Если у кого-то есть варианты, буду благодарен за любые предложения ![]() Это сообщение отредактировал(а) KL7 - 27.7.2009, 12:29 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 11 Всего: 33 |
Что-то вроде:
По моему, нужно копать в сторону QPaintDevice. Не уверен. Это сообщение отредактировал(а) andrew_121 - 27.7.2009, 13:31 -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Тебе нужно только отображение данных или и редактирование тоже?
|
|||
|
||||
pan2004 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 6 Всего: 9 |
Делаешь свой виджет, и пишешь в нем свою paintEvent(), в котором выводишь строку в зависимости от QTimeLine. Можно и с субпиксельной точностью, благо QPainter поддерживает дробные координаты
Если нужно редактирование, при щелчке заменяешь его на обычный QLineEdit. Я думаю, бегающую строку неудобно редактировать в анимированном виде) Это сообщение отредактировал(а) pan2004 - 27.7.2009, 15:39 |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
||||
|
||||
KL7 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
спс... но в таком абстрактном виде я тоже знаю, как сделать ![]() спс, сейчас будем вникать ![]() |
|||
|
||||
KL7 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
SABROG, как выяснилось, в исходниках представлен "простой" вариант бегущей строки, в которой текст сдвигается посимвольно... мне же хотелось бы иметь попиксельный вариант...
в общем я начал писать свой виджет =) вопрос первый: текст я буду рисовать в нужной позиции, используя QPainter, т.е. в конечном счете текст превратится в изображение... но мне необходимо, чтобы в окне был виден только та часть текста, которая находится внутри моего виджета... для етого надо использовать ClipArea? в свою очередь мне хотелось бы, чтобы виджет был ограничен рамкой, схожей с рамкой QLineEdit, которая с радостью подвергается изменениям через таблицы стилей: изменяется ее цвет, толщина, радиус и отступ(padding)... как ето реализовать? чем я должен ограничить свой виджет для таких целей и как ето сделать? судя по документации QLineEdit рисует рамку через QFrame (весьма логично), искользуя свойства из QStyleOptionFrame... ето можно сделать через drawPrimitive, используя все те же свойства... но как инициализировать QStyleOptionFrame используя правила из stylesheet-файла? и как потом получить размер и положение области, которая находится полностью внутри QFrame (желательно с учетом padding)? если ее получить, то она может выступать в качестве ClipArea... дальше пока все выглядит весьма прозрачно... рисую текст в нужной позиции (все что вне виджета будет просто оставаться невидимым), а по таймеру пересчитываю позиции и если нужно редактирую отображаемый текст (если символ уже гарантированно вылез из поля виджета, то он просто удаляется из строки, а при необходимости справа добавляются новые символы)... Это сообщение отредактировал(а) KL7 - 28.7.2009, 21:49 |
|||
|
||||
KL7 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
пишу потиху свой виджет... возникло пару вопросов...
1. Мой виджет путем drawPrimitive обретает вокруг себя рамочку... ета рамочка рисуется с учетом всех stylesheet-свойств, в том числе padding... потом, используя SE_FrameContent, я получаю прямоугольник, расположенный внутри рамочки и внутри padding-a, в котором я рисую свой текст... а теперь мне надо получить точно такой же прямоугольник, но уже содержащий padding-область... ето прямоугольник я хочу залить 50/50 двумя фоновыми цветами... но я так и не смог получить ни сам треугольник прямоугольник, ни размеры padding-a (можно наверно самому проанализировать stylesheet и из него вытянуть, например, "padding: 5px", но может есть более приемлемые методы?) 2. Мой виджет подразумевает ввод текста... или скорее не ввод, а обработку текста... вобщем он должен особым образом реагировать на нажатия клавиш, отвечающих за печатные символы... как ето грамотно сделать? что надо работать с keyPressEvent - ето мне понятно... про модификаторы (shift) также что-то читал, но общая схема пока не понятна... буду благодарен за помощь... Это сообщение отредактировал(а) KL7 - 4.8.2009, 14:55 |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Вероятно опечатка? Ты выбрал для себя не простую задачу. Мало у кого есть опыт рисования собственного виджета, а те у кого он есть ввязываться в это не будут, т.к. прекрасно понимают сколько там еще геморроя впереди. Я как-то заморачивался с собственным titlebar'ом и чужим combobox'ом, больше мне не хочется в это втягиваться. Могу лишь посоветовать изучать исходники Qt и исходники чужих виджетов. |
|||
|
||||
KL7 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
так и есть =) спасибо, обнадежили =) ну я не имею наполеоновских планов... просто пока у меня нет ни одной конкретной задачи, вот решил что-нибудь пописать, но чтобы интересно было... не получится - значит не получится, но опыт какой-то точно получу.. если рисовать совсем свой виджет без поддержки stylesheet-ов, то все не так уж и сложно... сам как-нибудь обработал отступы, рамочки и можно даже для всего сделать настройки... но я хотел попытаться адаптировать самодельный виджет под Qt-стили... но все оказалось труднее, чем я предполагал, поскольку прямого доступа к элементам стиля не имеешь, а предлагаемые примитивы (элементы виджетов, различные области) похоже охватывают не все аспекты... а исходники... все конечно хорошо, но сложно... я пытался изучать QLineEdit... какую-то информацию оттуда почерпнул, но в реализации класса широко применяются свои внутренние технологии, которые в "общественном" Qt никак не представлены (или просто не описаны)... так, например, там используется какой-то удивительный заголовочный private-файл, различные макросы и те же элементы стиля (отступы, толщина и ширина) берутся из какого-то удивительного объекта, сущность которого я пока не осознал... возможно в етом и нет необходимости... буду ковыряться - до сентября еще месяц каникул =) и все же если будут предложения - буду признателен... тут пожалуй основная проблема - внутри чего рисовать етот текст... был бы QFrame более навороченным (возможно я его плохо знаю ![]() |
|||
|
||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Посмотри может исходники виджетов http://www.wysota.eu.org/wwwidgets/ и тут http://www.qt-apps.org/index.php?xcontentmode=4298
|
|||
|
||||
KL7 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
спасибо... буду изучать... хотя wwwidget-ы написаны в том же стиле, что и стандартные, а там мне далеко не все понятно... но буду разбираться =) а подскажите, как получить прямоугольник, описывающий внутреннюю область рамки, которая рисуется таким вот образом:
рамочка имеет толщину и закругления, заданные через stylesheet... пока ето основная проблема... |
||||
|
|||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
К сожалению у меня были плохие оценки в школе, я совершенно не понимаю, что от меня требуется, когда читаю задачу.
А эти параметры нельзя получить, если в документации кликнуть на ссылку "List of all members, including inherited members"? Это сообщение отредактировал(а) SABROG - 4.8.2009, 19:17 |
|||
|
||||
KL7 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
попытаюсь объяснить доходчивее... ![]() мне нужно любым путем получить характеристики желтого прямоугольника... буду признателен, если прямо и без иронии скажете, как ето сделать...
применительно к какому классу? QFrame-а у меня в коде нет... возможно стоит наследовать мой виджет от QFrame, но ето другой вопрос... int QStyleOptionFrame::lineWidth пока мне ничего кроме нуля не согласился вернуть, хотя рамочка рисуется толщиной в 6 пикселей... радиус закругления мне в принципе не нужен, но ради интереса поискал - не нашел я его нигде в Qt Assistant-e... так что этот параметр похоже нельзя получить даже "если в документации кликнуть на ссылку "List of all members, including inherited members"... |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Привязываться к стайлшитам не есть гуд. Вообще говоря - эта рамка зависит от стиля (QStyle) для текущего виджета/апилкейшена. При установке стайлшита используется прокси-стиль QStyleSheetStyle. Который.. вообще говоря вроде не экспортируется из Qt (всмысле экспортируется то - само собой, но в официальных инклюдах его нет). Далее - у него есть метод renderRule, позволяющий получить правила отображения для конкретного виджета, у коготорого метод borderRect... Одним словом - документированного способа получить толщину бордера нельзя. К сожалению, но это минус проектирования QStyle (хотя скорее - стайлшитов, ибо можно было в QStyleOption::initFrom считывать стиль виджета, а у стиля иметь методы инициализирующие ту же толщину бордера.. Как-то так.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |