Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Август 06, 2012, 10:16



Название: Эффект перелистывания страниц
Отправлено: virtual_root от Август 06, 2012, 10:16
Добрый день ребята! Пишу простенькую программку "контакты". Вопрос касается внешнего вида. Форма программы представляет собой развернутую книгу. Где на левой стороне книги отображается список контактов, разбитых по группам, а с правой стороны книги отображается информация о выбранном контакте. Нужно сделать такой эффект: При выборе контакта с лева на правой стороне должна перелистываться страница книги, как будто мы открыли выбранный контакт.
Не знаю с чего начать работу над таким эффектом... Хотелось бы обойтись без openGL. Может у кого есть идеи реализации такого эффекта? Ребята подскажите пожалуйста, как такого добиться!
P.S. Нравится эффект как на iPad - контакты. Хочу такое же сделать.


Название: Re: Эффект перелистывания страниц
Отправлено: Bepec от Август 06, 2012, 10:19
Подари мне ipad - я посмотрю как там сделано и тебе сделаю :D

PS GraphicsView позволяет делать всё что угодно.


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 06, 2012, 10:20
 :D спасибо) А по подробней можно ?)
Вот картинка что примерно хочется.


Название: Re: Эффект перелистывания страниц
Отправлено: kambala от Август 06, 2012, 10:56
на хабре писали как сделать такую анимацию: приводились формулы и реализация под iOS


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 06, 2012, 10:59
Если без OpenGL, то у объекта QPainter есть метод setTransform, с помощью которого устанавливается объект QTransform, который отвечает за повороты, масштабирование и др. преобразования.
Здесь самое сложное написать матрицу преобразования, т. к. все это в 2D.
В OpenGL можно было бы использовать стандартную матрицу поворота.


Название: Re: Эффект перелистывания страниц
Отправлено: lighting от Август 06, 2012, 11:02
или QML. Фоном используешь раскрытую книгу, а для страницы задаешь анимацию поворота. Только центр поворота сместить надо - по умолчанию поворачиваться будет вокруг центра изображения.


Название: Re: Эффект перелистывания страниц
Отправлено: Странник от Август 06, 2012, 12:29
Google в помощь - как-то мне попадалась анимация перелистывания страниц книги с использованием QML, но искать, простите, недосуг.


Название: Re: Эффект перелистывания страниц
Отправлено: Igors от Август 06, 2012, 13:34
Анимация что Вы привели - жульничество, изображение не перспективное и не изометрическое :) Если это устраивает, то просто масштабируете по оси X, масштаб = cos(rotate_angle), а потом сдвигаете имедж  по столбцам, заполняя краешки прозрачным цветом

Edit: хотя в принципе такой сдвиг тоже описывается матрицей. Попробуем сконструировать. Система координат: центр в левой верхней точке, Y идет вниз, значит с осью Y все ясно (0, 1). X смасштабирован да еще чуть повернут
Код
C++ (Qt)
const qreal max_fool_rot = 20 * M_PI / 180;  // максимальный угол "сдвига" в радианах на угле 90
 
void BuildTransform( qreal angle_degree, QTransform & trans )
{
 qreal angle = angle_degree  * M_PI / 180;
 qreal fool_angle = max_fool_rot * sin(angle);
 qreal scaleX = cos(angle);
 qreal m00 = cos(fool_angle) * scaleX;
 qreal m01 = -sin(fool_angle) * scaleX;
 trans = QTransform(m00, m01, 0, 1, 0, 0);
}
 
Ну и крутить QImage::transformed


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 06, 2012, 14:26
Спасибо вам ребята! Картинку что я привела, это примерно. Из ваших ответов решила всё таки с openGL повозиться, так как хочу потом и для iPad применить тот же эффект, а насколько мне известно openGL кроссплатформенен. В google нашла похожую статью: habrahabr.ru/post/132053/ (http://habrahabr.ru/post/132053/)


Название: Re: Эффект перелистывания страниц
Отправлено: Bepec от Август 06, 2012, 14:28
ы. Вообще то и Qt кроссплатформенен :)


Название: Re: Эффект перелистывания страниц
Отправлено: Igors от Август 06, 2012, 14:50
Спасибо вам ребята! Картинку что я привела, это примерно. Из ваших ответов решила всё таки с openGL повозиться, так как хочу потом и для iPad применить тот же эффект, а насколько мне известно openGL кроссплатформенен. В google нашла похожую статью: habrahabr.ru/post/132053/ (http://habrahabr.ru/post/132053/)
Я стараюсь избегать OpenGL насколько возможно, но увы, это не всегда удается. Штука неплохая но очень много надо запоминать. Впрочем если много молодой памяти и силы - то почему нет, кому что нравится.

Вот если надо гнуть страницы (bend), тогда использование OpenGL имеет смысл


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 06, 2012, 15:11
Да, странички должны сгибаться. На приведенной картинке немного по другому, проще изображено. Вот у меня тут вопрос всплыл. Если я openGL отрисую книгу и эффект этот сделаю, то потом возможно будет на странице отрисованной книги разместить стандартные компоненты Qt? Наверное многие уже пользовались openGL в Qt и смогут пояснить как это делается?
Я просто рисовала на openGL только в консольном проекте. Создавала форму средствами openGL и на ней рисовала, поэтому наверное чего-то не до понимаю.


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 06, 2012, 16:00
ы. Вообще то и Qt кроссплатформенен :)
OpenGL платформонезависимый, а Qt кроссплатформенен только на наборе платформ.


Название: Re: Эффект перелистывания страниц
Отправлено: Igors от Август 06, 2012, 16:07
Да, странички должны сгибаться. На приведенной картинке немного по другому, проще изображено. Вот у меня тут вопрос всплыл. Если я openGL отрисую книгу и эффект этот сделаю, то потом возможно будет на странице отрисованной книги разместить стандартные компоненты Qt? Наверное многие уже пользовались openGL в Qt и смогут пояснить как это делается?
Я просто рисовала на openGL только в консольном проекте. Создавала форму средствами openGL и на ней рисовала, поэтому наверное чего-то не до понимаю.
Для OpenGL страница книги - просто 3D модель, которая, как обычно, состоит из полигонов - маленьких квадратиков, поэтому страница может гнуться. На модель наложена "текстура", т..е. картинка которая привязана к полигонам и гнется вместе с ними. Таким образом для OpenGL нужна картинка, все "компоненты Qt" ему до лампочки. Ну Вы можете отренедерить в картинку и подсунуть.

OpenGL платформонезависимый, а Qt кроссплатформенен только на наборе платформ.
Если уж умничать то надо сказать OpenGL карто/железо - зависимый что бывает куда больнее  :)


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 06, 2012, 17:08
Если уж умничать то надо сказать OpenGL карто/железо - зависимый что бывает куда больнее  :)
Если в GPU нет поддержки соответствующей версии OpenGL, то расчеты идут через CPU.


Название: Re: Эффект перелистывания страниц
Отправлено: Bepec от Август 06, 2012, 17:31
ДмитрийМ - Qt настолько же кроссплатформенна как и OpenGl. Уж на военном тактическом компе, ни она, ни он не пойдут.
PS зуб даю :)


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 06, 2012, 17:33
Ребят, получается можно вообще свой компонент такой сделать - перелистываемая книга. А потом в qt его добавить  и пользоваться им, так ?
только как вот сделать чтоб я на своем компоненте могла разместить другие компоненты, ну что-то наподобие Qwidget сделать. Я наверное чего-то не до понимаю...
 


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 06, 2012, 22:07
ДмитрийМ - Qt настолько же кроссплатформенна как и OpenGl. Уж на военном тактическом компе, ни она, ни он не пойдут.
PS зуб даю :)
Проверено, на МСВС все идет  ;)
OpenGL под Android,iOS есть, а Qt нормального под них нет.


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 06, 2012, 22:19
Ребят, получается можно вообще свой компонент такой сделать - перелистываемая книга. А потом в qt его добавить  и пользоваться им, так ?
только как вот сделать чтоб я на своем компоненте могла разместить другие компоненты, ну что-то наподобие Qwidget сделать. Я наверное чего-то не до понимаю...
 
Наверное стоит посмотреть сюда (http://www.prog.org.ru/index.php?topic=19458.msg131442#msg131442)


Название: Re: Эффект перелистывания страниц
Отправлено: Bepec от Август 07, 2012, 06:56
Значит есть ненормальный :D Но есть.

А рассуждать так, что OpenGl пойдёт везде - это надеяться на бога. Ибо нет и никогда не будет всеобщих кроссплатформенных решений :)


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 07, 2012, 10:07
А рассуждать так, что OpenGl пойдёт везде - это надеяться на бога. Ибо нет и никогда не будет всеобщих кроссплатформенных решений :)
Скажи, где нет OpenGL?


Название: Re: Эффект перелистывания страниц
Отправлено: Bepec от Август 07, 2012, 10:21
OpenGl - открытая графическая библиотека. Тебя устроит этот ответ? :)


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 07, 2012, 10:25
Ребят, а можно же по идеи внешний вид формы перерисовать ? Переопределить какое-то событие в котором можно на opengl внешний вид формы отрисовать. Я тогда в виде своей книги и хочу форму прорисовать.


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 07, 2012, 10:28
Мне всё-таки не понятно по вопросу с компонентом. Если я сделаю свой opengl проект в qt как мне его потом сделать компонентом для qt дизайнера ? Мне хочется чтоб можно было его потом на форму как компонент перетащить, а на него сверху другие компоненты положить. Запустить и всё работает)


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 07, 2012, 10:34
OpenGl - открытая графическая библиотека. Тебя устроит этот ответ? :)
Конечно нет, т. к. opengl по существу набор спецификаций, и является промышленным стандартом.


Название: Re: Эффект перелистывания страниц
Отправлено: Bepec от Август 07, 2012, 10:47
Увы и ах, но это спецификации направлены на железо. Если карточка старая(новая китайская) не поддерживает его, то нужно будет 3-4 самосвала с лесом, чтобы костылями его приляпать.

Да, он сейчас принят и поддерживается большинством производителей. Но большинство это не всё, как ни печально. 

PS и да, не путай МСВС и военный тактический комп :) Первое это ОС для военных нужд, ставящаяся на обычный комп. А второе это хрень, которая не выйдет никогда в широкую продажу и поддерживать opengl будет так-сяк скорее всего :) Самосвалы понадобятся.


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 07, 2012, 11:10
Увы и ах, но это спецификации направлены на железо. Если карточка старая(новая китайская) не поддерживает его, то нужно будет 3-4 самосвала с лесом, чтобы костылями его приляпать.

Да, он сейчас принят и поддерживается большинством производителей. Но большинство это не всё, как ни печально. 
Если не поддерживается GPU, вычисления идут через CPU.


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 07, 2012, 11:54
Ребят, ответьте мне, пожалуйста.
У меня ещё вопрос по реализации на opengl:
как мне так отрисовать страницу которая должна изгибаться и перелистываться но вместе с текстом который я на ней разместила(а размещать я планирую так: компонент qtextedit поверх правой страницы книги отрисовать). Может кто подскажет идею реализации ? Ведь если я буду пустую страницу перелистывать это будет сразу заметно...


Название: Re: Эффект перелистывания страниц
Отправлено: Bepec от Август 07, 2012, 11:58
Вам видимо надо будет брать изображение текущего содержимого страницы, тырить изображение в картинку и передавать в opengl. Как то так.

PS Платформонезависимого 100% решения нет. Есть решения, решающие задачи на определённом количестве платформ, но на всех увы.
ДмитрийМ я больше не буду с тобой спорить :) Что по тебе горох, что по лбу тебе :) Печально когда стоят только на одной стороне дороги и кричат - я с левом стороны дороги! А ему в ответ - Нет, я с левой стороны дороги! :D



Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 07, 2012, 12:17
нашла что хочу сделать на OpenGL! http://www.cecilfox.de/content.htm (http://www.cecilfox.de/content.htm)
Мне похоже нужна текстура динамической левой страницы, я правая меняться и не будет, просто надо поверх неё рисовть перелистывание.


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 07, 2012, 12:19
только вот вопрос с внедрением виджетов в страницу остаются... что-то до меня не доходит как мне так хитро с виджетами поступить..


Название: Re: Эффект перелистывания страниц
Отправлено: Igors от Август 07, 2012, 15:21
нашла что хочу сделать на OpenGL! http://www.cecilfox.de/content.htm (http://www.cecilfox.de/content.htm)
Мне похоже нужна текстура динамической левой страницы, я правая меняться и не будет, просто надо поверх неё рисовть перелистывание.
Конечно это Ваше дело чем заниматься. Но заметим что начинать изучение такой мощности как OpenGL просто для того чтобы "листать страницы" - скажем так, не очень практично. Ну даже если в конце-концов сделаете то листание - кого Вы этим удивите? Быстро найдется деятель который заявит что на XML (или др цацке) это делается "элементарно". Чего Вы лезете в кучу где и так много народа? 

А творческие задачи есть, можно сказать, под носом. Ваша ссылка напомнила мне старую тему http://www.prog.org.ru/index.php?topic=14281.msg93215#msg93215 (http://www.prog.org.ru/index.php?topic=14281.msg93215#msg93215)
И то уже не в UI керосин заливать и не по либам бегать - серьезная разработка


Название: Re: Эффект перелистывания страниц
Отправлено: virtual_root от Август 07, 2012, 15:28
меня попросили помочь такое сделать, и мне стало интересно. Хочу спросить, а можно как-то отобразить в сцене(QGraphicsScene) нарисованные на opengl фигуры?  Или может рисовть средствами opengl прямо на сцене ?


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 07, 2012, 17:54
меня попросили помочь такое сделать, и мне стало интересно. Хочу спросить, а можно как-то отобразить в сцене(QGraphicsScene) нарисованные на opengl фигуры?  Или может рисовть средствами opengl прямо на сцене ?

QPainter все равно, где рисовать виджет. Можешь посмотреть исходный код всяких fb читалок, имеющих ядро и куча разных интерфейсов.
Там не используются стандартные виджеты, для отображения текста.

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


Название: Re: Эффект перелистывания страниц
Отправлено: DmitryM от Август 07, 2012, 19:41
PS Платформонезависимого 100% решения нет. Есть решения, решающие задачи на определённом количестве платформ, но на всех увы.
ДмитрийМ я больше не буду с тобой спорить :) Что по тебе горох, что по лбу тебе :) Печально когда стоят только на одной стороне дороги и кричат - я с левом стороны дороги! А ему в ответ - Нет, я с левой стороны дороги! :D
Open GL | ES есть на всех современных операционных системах с графическим пользовательским интерфейсом, поэтому код использующий opengl более переносим, чем qt.