Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать аналог бегущей строки? Полный контроль расположения текста... 
:(
    Опции темы
KL7
  Дата 27.7.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Для определенных задумок необходим аналог QLineEdit, но с полным контролем горизонтального расположения текста... 
Будем считать что надо реализовать нециклическую бегущую строку (прям как в новостях  smile )... 

Анимационная составляющая мне кажется не проблемой (освоюсь с таймерами и справлюсь наверно), но проблема в том, что мне нужно плавное движение текста, т.е. возможность при необходимости передвинуть текст скажем на 1px... Так же необходима грамотная обработка виджета справа и слева, т.е. как же будут появляться и исчезать символы, после того, как они появились в видимой области или покинули ее...

Как ето можно реализовать? Идеи у меня есть, но пока они слишком абстрактны... 
Если у кого-то есть варианты, буду благодарен за любые предложения  smile 

Это сообщение отредактировал(а) KL7 - 27.7.2009, 12:29
PM MAIL ICQ   Вверх
andrew_121
Дата 27.7.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 11
Всего: 33



Что-то вроде:
Код

class MyLineEdit: public QLineEdit, public QThread {
};

По моему, нужно копать в сторону QPaintDevice. Не уверен.

Это сообщение отредактировал(а) andrew_121 - 27.7.2009, 13:31


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Любитель
Дата 27.7.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Тебе нужно только отображение данных или и редактирование тоже?


--------------------
PM MAIL ICQ Skype   Вверх
pan2004
Дата 27.7.2009, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 357
Регистрация: 28.7.2007

Репутация: 6
Всего: 9



Делаешь свой виджет, и пишешь в нем свою paintEvent(), в котором выводишь строку в зависимости от QTimeLine. Можно и с субпиксельной точностью, благо QPainter поддерживает дробные координаты
Если нужно редактирование, при щелчке заменяешь его на обычный QLineEdit. Я думаю, бегающую строку неудобно редактировать в анимированном виде)

Это сообщение отредактировал(а) pan2004 - 27.7.2009, 15:39


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
SABROG
Дата 27.7.2009, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Вот, может почерпнешь какую-нибудь идею.

Это сообщение отредактировал(а) SABROG - 27.7.2009, 16:05


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
KL7
  Дата 27.7.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(pan2004 @  27.7.2009,  15:38 Найти цитируемый пост)
Делаешь свой виджет, и пишешь в нем свою paintEvent(), в котором выводишь строку в зависимости от QTimeLine. Можно и с субпиксельной точностью, благо QPainter поддерживает дробные координаты
Если нужно редактирование, при щелчке заменяешь его на обычный QLineEdit. Я думаю, бегающую строку неудобно редактировать в анимированном виде)

спс... но в таком абстрактном виде я тоже знаю, как сделать  smile  мне надо более конкретная помощь, как же именно добавлять и удалять символы, как их хранить и все остальное... я посмотрел на QFontMetrics - етот класс похоже позволяет получить исчерпывающую информацию о геометрических характеристиках текста, а ето уже хорошо... 


Цитата(SABROG @  27.7.2009,  16:04 Найти цитируемый пост)
Вот, может почерпнешь какую-нибудь идею.

спс, сейчас будем вникать  smile 
PM MAIL ICQ   Вверх
KL7
  Дата 28.7.2009, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
KL7
  Дата 4.8.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL ICQ   Вверх
SABROG
Дата 4.8.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(KL7 @  4.8.2009,  11:45 Найти цитируемый пост)
прямоугольник


Цитата(KL7 @  4.8.2009,  11:45 Найти цитируемый пост)
треугольник

Вероятно опечатка?

Ты выбрал для себя не простую задачу. Мало у кого есть опыт рисования собственного виджета, а те у кого он есть ввязываться в это не будут, т.к. прекрасно понимают сколько там еще геморроя впереди. Я как-то заморачивался с собственным titlebar'ом и чужим combobox'ом, больше мне не хочется в это втягиваться. Могу лишь посоветовать изучать исходники Qt и исходники чужих виджетов.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
KL7
Дата 4.8.2009, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(SABROG @  4.8.2009,  12:41 Найти цитируемый пост)
Вероятно опечатка?

так и есть =)

Цитата(SABROG @  4.8.2009,  12:41 Найти цитируемый пост)
Ты выбрал для себя не простую задачу. Мало у кого есть опыт рисования собственного виджета, а те у кого он есть ввязываться в это не будут, т.к. прекрасно понимают сколько там еще геморроя впереди. Я как-то заморачивался с собственным titlebar'ом и чужим combobox'ом, больше мне не хочется в это втягиваться. Могу лишь посоветовать изучать исходники Qt и исходники чужих виджетов. 

спасибо, обнадежили =)
ну я не имею наполеоновских планов... просто пока у меня нет ни одной конкретной задачи, вот решил что-нибудь пописать, но чтобы интересно было... не получится - значит не получится, но опыт какой-то точно получу..

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

а исходники... все конечно хорошо, но сложно... я пытался изучать QLineEdit... какую-то информацию оттуда почерпнул, но в реализации класса широко применяются свои внутренние технологии, которые в "общественном" Qt никак не представлены (или просто не описаны)... так, например, там используется какой-то удивительный заголовочный private-файл, различные макросы и те же элементы стиля (отступы, толщина и ширина) берутся из какого-то удивительного объекта, сущность которого я пока не осознал... возможно в етом и нет необходимости...

буду ковыряться - до сентября еще месяц каникул =) 
и все же если будут предложения - буду признателен...
тут пожалуй основная проблема - внутри чего рисовать етот текст... был бы QFrame более навороченным (возможно я его плохо знаю  smile ), было бы наверно проще... но по умолчанию ето просто рамочка без каких-либо перспектив...
PM MAIL ICQ   Вверх
SABROG
Дата 4.8.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Посмотри может исходники виджетов http://www.wysota.eu.org/wwwidgets/ и тут http://www.qt-apps.org/index.php?xcontentmode=4298


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
KL7
Дата 4.8.2009, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(SABROG @  4.8.2009,  15:21 Найти цитируемый пост)
Посмотри может исходники виджетов http://www.wysota.eu.org/wwwidgets/ и тут http://www.qt-apps.org/index.php?xcontentmode=4298 

спасибо... буду изучать... хотя wwwidget-ы написаны в том же стиле, что и стандартные, а там мне далеко не все понятно... но буду разбираться =)

а подскажите, как получить прямоугольник, описывающий внутреннюю область рамки, которая рисуется таким вот образом:
Код

QStyleOptionFrameV3 opt;
opt.initFrom(this);
style()->drawPrimitive(QStyle::PE_Frame, &opt, &painter, this);

рамочка имеет толщину и закругления, заданные через stylesheet...
пока ето основная проблема...
PM MAIL ICQ   Вверх
SABROG
Дата 4.8.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(KL7 @  4.8.2009,  18:05 Найти цитируемый пост)
описывающий внутреннюю область рамки

К сожалению у меня были плохие оценки в школе, я совершенно не понимаю, что от меня требуется, когда читаю задачу.

Цитата(KL7 @  4.8.2009,  18:05 Найти цитируемый пост)
рамочка имеет толщину и закругления, заданные через stylesheet...
пока ето основная проблема... 


А эти параметры нельзя получить, если в документации кликнуть на ссылку "List of all members, including inherited members"?

Это сообщение отредактировал(а) SABROG - 4.8.2009, 19:17


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
KL7
Дата 5.8.2009, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: 2
Всего: 2



Цитата(SABROG @  4.8.2009,  19:16 Найти цитируемый пост)
К сожалению у меня были плохие оценки в школе, я совершенно не понимаю, что от меня требуется, когда читаю задачу.

попытаюсь объяснить доходчивее... 
user posted image
мне нужно любым путем получить характеристики желтого прямоугольника... буду признателен, если прямо и без иронии скажете, как ето сделать...


Цитата(SABROG @  4.8.2009,  19:16 Найти цитируемый пост)
А эти параметры нельзя получить, если в документации кликнуть на ссылку "List of all members, including inherited members"?

применительно к какому классу? QFrame-а у меня в коде нет... возможно стоит наследовать мой виджет от QFrame, но ето другой вопрос...

int QStyleOptionFrame::lineWidth пока мне ничего кроме нуля не согласился вернуть, хотя рамочка рисуется толщиной в 6 пикселей...

радиус закругления мне в принципе не нужен, но ради интереса поискал - не нашел я его нигде в Qt Assistant-e... так что этот параметр похоже нельзя получить даже "если в документации кликнуть на ссылку "List of all members, including inherited members"...
PM MAIL ICQ   Вверх
Любитель
Дата 5.8.2009, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 16
Всего: 92



Привязываться к стайлшитам не есть гуд. Вообще говоря - эта рамка зависит от стиля (QStyle) для текущего виджета/апилкейшена. При установке стайлшита используется прокси-стиль QStyleSheetStyle. Который.. вообще говоря вроде не экспортируется из Qt (всмысле экспортируется то - само собой, но в официальных инклюдах его нет). Далее - у него есть метод renderRule, позволяющий получить правила отображения для конкретного виджета, у коготорого метод borderRect... Одним словом - документированного способа получить толщину бордера нельзя. К сожалению, но это минус проектирования QStyle (хотя скорее - стайлшитов, ибо можно было в QStyleOption::initFrom считывать стиль виджета, а у стиля иметь методы инициализирующие ту же толщину бордера.. Как-то так.


--------------------
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.