![]() |
|
![]() ![]() ![]() |
|
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 считывать стиль виджета, а у стиля иметь методы инициализирующие ту же толщину бордера.. Как-то так.
|
|||
|
||||
KL7 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
понятно... и если нужна полноценная поддержка чего-то наподобие скинов, то надо читать в сторону стилей? подумаем... не хотелось бы разводить много тем, так что еще спрошу: покажите, где почитать про private-классы (например, QLabel активно взаимодействует с QLabelPrivate), которые нередко в Qt используются... хоть какую-то информацию о том, каково предназначение и как использовать ету технологию... она ведь наверняка как-то обоснована... |
|||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 16 Всего: 92 |
Стайлшиты реализуются через QStyleSheetStyle. Только его почему-то решили сделать недокументированным.. Но тем не менее - это один из стилей. Ну, по сути классический с++-ный паттерн PImpl. Преимущество в отсутствии необходимости вынесения деталей в хидер. Ведь даже при изменении прайват данных класса мы должны перекомпилировать всё, что использует этот класс (всмысле использует класс, а не используется классом). Выделение же отдельного внутреннего класса + указатель на объект этого класса в хидере позволяет этого избежать. Другими словами - это общепринятый костыль ![]() |
|||
|
||||
KL7 |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
во-первых, спасибо за информацию =) почитал, стало гораздо понятнее... пытался применить в данном проекте, но пока и без новых паттернов проблем хватает, но в будущем буду знакомится с такими вещами... а теперь... мой виджет... функциональность реализована примерно на 80% =) Т.е. он уже почти умеет все, что должен... но качество реализации не важное... ![]() собственно код... main.cpp
typingarea.h
typingarea.cpp
1. Буду благодарен за любую критику (как в сторону реализации, так и в сторону грамотности кода). Только не в слишком грубой форме. 2. Проблема анимации... В светлом будущем, в которое мы с Вами идет, етот виджет станет основной частью клавиатурного тренажера. Причины две: мне нужна интересная задача, чтобы набраться опыта, и мне нужен тернажер моей мечты с плавной прокруткой строки и другими моментами. Поетому ето должен быть хороший продуманный виджет, который не будет сильно нагружать железо. Но как оказалось все не так-то просто Анимацию я реализовал как сумел. Етот код у меня на староватом компе вроде как работает, но как только я меняю величину шрифта с 35 на 55, то все начинает жутко виснуть. Размер шрифта должен лишь зумировать виджет, а скорость отклика должна сохранится.... Но виджет начинает реагировать гораздо хуже и буковки ползут раз в пять медленее... Хотелось бы решить ету проблему, так что нужен совет и пояснение, что же тут не так... Заранее приношу большие извинения за отсутствие каких-либо комментариев. И буду искренне благодарен, если Вы (абстрактный программист) не заленитесь почитать етот быть может не слишком достойный код... PS как заставить eclipse по Ctrl+Tab мирно ходить по всем вкладкам, а не только по двум последним? ![]() |
||||||
|
|||||||
SABROG |
|
||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
На самом деле хотелось бы больше скриншотов и аттач с исходниками. На форуме не удобно изучать код. Тут, я так понимаю, приносится в жертву кроссплатформенность библиотеки. В чем необходимость наследования от QFrame, если рамку можно нарисовать самому? Возможно это лишнее. Более базового таймера чем QObject::startTimer() и QObject::timerEvent() еще не придумали. Не знаю как остальные программисты, но я предпочитаю подобные методы оставлять в хедерах с ключевым словом inline.
Надо проанализировать профайлером. Возможно косяк в коде. Может быть готовую картинку можно закэшировать и всего-лишь двигать по виджету. |
||||
|
|||||
KL7 |
|
||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
завтра исправлюсь...
Что имеется ввиду? В принципе это значение по умолчанию временно и оно будет пересмотрено =)
Рамка и рисуется самостоятельно, т.е. через drawPrimitive, а наследование осталось из-за первоначальных задумок. Надо заменить на QWidget
Примерно представляю, что такое профайлер, но если не трудно - задайте направление, где почитать. Кэширование, думаю, возможно, но над етим надо поработать. Несколько вариантов более простой оптимизации уже придумал. А ошибка в коде очень вероятно... Пару дней назад я в paintEvent вызывал унаследованный от QFrame метод drawFrame - виджет перерисовывался без остановки и все сильно висло. Потратил не мало времени, пока разобрался. |
||||||||||||
|
|||||||||||||
SABROG |
|
|||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Шрифт.
gprof |
|||
|
||||
KL7 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 59 Регистрация: 7.12.2008 Где: Minsk City Репутация: 2 Всего: 2 |
это я понял... Вы хотели сказать, что Comic Sans есть далеко не на всех платформах или что? почитал... в принципе разобрался... Но судя по тому, что я нашел, для работы с qt и gprof необходимо все библиотеки пересобрать в статик с параметром -pg. Если сам не смогу решить проблему, то все же пересоберу. Кое-какие корректировки в коде сделал. Лучше работать пока не стало. ![]() ------ edited ----- только что договорился с gprof, буду изучать... а наибольшие временные затраты идут на drawText... чем больше (по размерам!) текст, тем труднее приходится процессору... я оптимизировал код, но все равно на большом размере шрифта подтормаживает... буду думать Это сообщение отредактировал(а) KL7 - 10.8.2009, 13:48 |
|||
|
||||
DK2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 8.3.2011 Репутация: нет Всего: нет |
Подскажите как получить значение текста из QTextEdit
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
DK2, ты чего ? Задаёшь вопрос в чужой теме, в которой уже почти 2 года не было обновлений
![]() ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
DK2 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 8.3.2011 Репутация: нет Всего: нет |
темой ошибся.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |