Russian Qt Forum
Сентябрь 21, 2024, 17:15 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Скрывающийся виджет.  (Прочитано 8868 раз)
nike1987
Гость
« : Декабрь 12, 2011, 19:53 »

Всем привет.
Есть программа, основанная на классе QMainWindow, в котором помещены виджеты QGarphicsView и панель управления.Хочу чтоб при нажатии кнопки панель управления скрывалась.Видел что-то подобное в примерах QML, так что единственный вариант что приходит в голову создать объект QDeclarative в нём описать объект QML и привязать размеры виджета к размерам QML.Так как с QML не имел дела, не знаю насколько это возможно, и вообще может можно сделать как-то по-другому?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Декабрь 12, 2011, 20:31 »

что такое "панель управления"? тулбар главного окна?

у всех виджетов есть метод setVisible(bool) (или его аналоги show()/hide()).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
nike1987
Гость
« Ответ #2 : Декабрь 12, 2011, 21:00 »

Да, тулбар окна.
Да, данный метод действительно убирает тулбар, но хотелось сделать всё это с анимацией.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Декабрь 13, 2011, 02:04 »

QPropertyAnimation
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
lighting
Гость
« Ответ #4 : Декабрь 13, 2011, 15:26 »

QPropertyAnimation
Какое свойство будем анимировать? AFAIK у виджета нет свойства "прозрачность".
Понятно что можно paintEvent переопределить, но думаю проще будет QML вставить.
Записан
nike1987
Гость
« Ответ #5 : Декабрь 13, 2011, 16:09 »

QPropertyAnimation
Какое свойство будем анимировать? AFAIK у виджета нет свойства "прозрачность".
Понятно что можно paintEvent переопределить, но думаю проще будет QML вставить.
Попробовал анимировать геометрию Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry), но проблема в том что тулбар убирается, а сам фон остаётся.Насколько я понимаю надо обновлять sizeHint тулбара, но не могу найти методы которые поменяли б его.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #6 : Декабрь 13, 2011, 17:24 »

QPropertyAnimation
Какое свойство будем анимировать? AFAIK у виджета нет свойства "прозрачность".
Понятно что можно paintEvent переопределить, но думаю проще будет QML вставить.
прозрачность есть (windowOpacity). а вообще я имел в виду свойство visible.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
nike1987
Гость
« Ответ #7 : Декабрь 13, 2011, 18:43 »

QPropertyAnimation
Какое свойство будем анимировать? AFAIK у виджета нет свойства "прозрачность".
Понятно что можно paintEvent переопределить, но думаю проще будет QML вставить.
прозрачность есть (windowOpacity). а вообще я имел в виду свойство visible.
Не очень понимаю как можно анимировать свойство которое возвращает bool.По идеи получится тот же эффект что и от setVisible.
Прозрачность тоже не совсем подойдёт, хотелось бы чтоб по скрыванию тулбара всё место занимал виджет QGraphicsView.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #8 : Декабрь 13, 2011, 21:01 »

Прозрачность тоже не совсем подойдёт, хотелось бы чтоб по скрыванию тулбара всё место занимал виджет QGraphicsView.
ну так проанимировать прозрачность, а потом вызвать тулбару hide()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
nike1987
Гость
« Ответ #9 : Декабрь 14, 2011, 12:02 »

Прозрачность тоже не совсем подойдёт, хотелось бы чтоб по скрыванию тулбара всё место занимал виджет QGraphicsView.
ну так проанимировать прозрачность, а потом вызвать тулбару hide()
Попробовал поставить свойство прозрачности Q_PROPERTY(qreal windowOpacity, READ windowOpacity, WRITE setWindowOpacity)
Но пишет вот такую ошибку:
Warning: Property declaration windowOpacity has no READ accessor function. The property will be invalid.
Хотя сам метод windowOpacity прекрасно работает.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #10 : Декабрь 14, 2011, 13:57 »

windowOpacity работает только с top виджетами (окнами), для виджетов лежащих на форме оно не работает (тулбар).

Прозрачность для виджетов можно менять с помощью QGraphicsOpacityEffect, установив его виджету с помощью метода setGraphicsEffect.

При анимировании прозрачности эффекта место под тулбаром в любом случае резервируется и не будет уменьшаться. При использовании метода setVisible тулбар схлопнется скачкообразно.

Можно попробовать анимировать вместе с прозрачностью, еще и высоту тулбара. Хотя я не уверен, что это сработает.

В этом случае лучше всего не использовать тулбары, а кнопки расположить на обычном виджете, тогда точно удастся анимировать его высоту.
Записан

Гугль в помощь
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #11 : Декабрь 14, 2011, 14:42 »

При анимировании прозрачности эффекта место под тулбаром в любом случае резервируется и не будет уменьшаться. При использовании метода setVisible тулбар схлопнется скачкообразно.
а нельзя проанимировать прозрачность, а потом синглшотовым таймером через 0-0.1 сек. хайднуть тулбар?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
lighting
Гость
« Ответ #12 : Декабрь 14, 2011, 16:14 »

я-то думал нужна анимация именно через уменьшение прозрачности виджета. В данном случае думаю подойдет move для тулбара чтобы задвинуть его вверх и geometry для QGarphicsView чтобы занять освободившееся место. Все это в параллельную анимацию.
Записан
nike1987
Гость
« Ответ #13 : Декабрь 14, 2011, 18:08 »

Извиняюсь я немнога не правильно описал проблему, тулбар у меня реализован как отдельный виджет, а не тулбар как элемент mainWindow.Изначально необходимо чтобы всё окно занимал виджет QGraphicsView, а поверх него необходимо поместить виджет, который будет прицеплен к краю окна(MainWindow) и по желанию пользователя его можно было скрывать(с анимацией соотвественно).QGraphicsWidget не подходит т.к. виджет определён внутри сцены и соотвественно координаты его тоже привязаны к сцене.
В принципе идеально было бы что-то подобное реализации DockWidget только поверх центрального виджета и добавить анимацию виджета, такое вообще можно сделать используя Qt?
Записан
lighting
Гость
« Ответ #14 : Декабрь 15, 2011, 10:22 »

Ну так и в чем проблема? Тогда вообще просто анимируйте положение вашего toolbar, например так
Создаем анимацию
Код
C++ (Qt)
  panelAnim = new QPropertyAnimation(ui->toolbar, "pos");
  panelAnim->setDuration(450);
  panelAnim->setEasingCurve(QEasingCurve::InOutQuad);
 
Скрываем тулбар
Код
C++ (Qt)
       if (!panelAnim->Stopped) panelAnim->stop();
       panelAnim->setStartValue(ui->toolbar->pos());
       panelAnim->setEndValue(QPoint(ui->toolbar->x(), -(ui->toolbar->height()+ui->toolbar->y()))));
       panelAnim->start();
   }
 
« Последнее редактирование: Декабрь 15, 2011, 10:24 от lighting » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.115 секунд. Запросов: 23.