Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: nike1987 от Декабрь 12, 2011, 19:53



Название: Скрывающийся виджет.
Отправлено: nike1987 от Декабрь 12, 2011, 19:53
Всем привет.
Есть программа, основанная на классе QMainWindow, в котором помещены виджеты QGarphicsView и панель управления.Хочу чтоб при нажатии кнопки панель управления скрывалась.Видел что-то подобное в примерах QML, так что единственный вариант что приходит в голову создать объект QDeclarative в нём описать объект QML и привязать размеры виджета к размерам QML.Так как с QML не имел дела, не знаю насколько это возможно, и вообще может можно сделать как-то по-другому?


Название: Re: Скрывающийся виджет.
Отправлено: kambala от Декабрь 12, 2011, 20:31
что такое "панель управления"? тулбар главного окна?

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


Название: Re: Скрывающийся виджет.
Отправлено: nike1987 от Декабрь 12, 2011, 21:00
Да, тулбар окна.
Да, данный метод действительно убирает тулбар, но хотелось сделать всё это с анимацией.


Название: Re: Скрывающийся виджет.
Отправлено: kambala от Декабрь 13, 2011, 02:04
QPropertyAnimation


Название: Re: Скрывающийся виджет.
Отправлено: lighting от Декабрь 13, 2011, 15:26
QPropertyAnimation
Какое свойство будем анимировать? AFAIK у виджета нет свойства "прозрачность".
Понятно что можно paintEvent переопределить, но думаю проще будет QML вставить.


Название: Re: Скрывающийся виджет.
Отправлено: nike1987 от Декабрь 13, 2011, 16:09
QPropertyAnimation
Какое свойство будем анимировать? AFAIK у виджета нет свойства "прозрачность".
Понятно что можно paintEvent переопределить, но думаю проще будет QML вставить.
Попробовал анимировать геометрию Q_PROPERTY(QRect geometry READ geometry WRITE setGeometry), но проблема в том что тулбар убирается, а сам фон остаётся.Насколько я понимаю надо обновлять sizeHint тулбара, но не могу найти методы которые поменяли б его.


Название: Re: Скрывающийся виджет.
Отправлено: kambala от Декабрь 13, 2011, 17:24
QPropertyAnimation
Какое свойство будем анимировать? AFAIK у виджета нет свойства "прозрачность".
Понятно что можно paintEvent переопределить, но думаю проще будет QML вставить.
прозрачность есть (windowOpacity). а вообще я имел в виду свойство visible.


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


Название: Re: Скрывающийся виджет.
Отправлено: kambala от Декабрь 13, 2011, 21:01
Прозрачность тоже не совсем подойдёт, хотелось бы чтоб по скрыванию тулбара всё место занимал виджет QGraphicsView.
ну так проанимировать прозрачность, а потом вызвать тулбару hide()


Название: Re: Скрывающийся виджет.
Отправлено: nike1987 от Декабрь 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 прекрасно работает.


Название: Re: Скрывающийся виджет.
Отправлено: navrocky от Декабрь 14, 2011, 13:57
windowOpacity работает только с top виджетами (окнами), для виджетов лежащих на форме оно не работает (тулбар).

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

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

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

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


Название: Re: Скрывающийся виджет.
Отправлено: kambala от Декабрь 14, 2011, 14:42
При анимировании прозрачности эффекта место под тулбаром в любом случае резервируется и не будет уменьшаться. При использовании метода setVisible тулбар схлопнется скачкообразно.
а нельзя проанимировать прозрачность, а потом синглшотовым таймером через 0-0.1 сек. хайднуть тулбар?


Название: Re: Скрывающийся виджет.
Отправлено: lighting от Декабрь 14, 2011, 16:14
я-то думал нужна анимация именно через уменьшение прозрачности виджета. В данном случае думаю подойдет move для тулбара чтобы задвинуть его вверх и geometry для QGarphicsView чтобы занять освободившееся место. Все это в параллельную анимацию.


Название: Re: Скрывающийся виджет.
Отправлено: nike1987 от Декабрь 14, 2011, 18:08
Извиняюсь я немнога не правильно описал проблему, тулбар у меня реализован как отдельный виджет, а не тулбар как элемент mainWindow.Изначально необходимо чтобы всё окно занимал виджет QGraphicsView, а поверх него необходимо поместить виджет, который будет прицеплен к краю окна(MainWindow) и по желанию пользователя его можно было скрывать(с анимацией соотвественно).QGraphicsWidget не подходит т.к. виджет определён внутри сцены и соотвественно координаты его тоже привязаны к сцене.
В принципе идеально было бы что-то подобное реализации DockWidget только поверх центрального виджета и добавить анимацию виджета, такое вообще можно сделать используя Qt?


Название: Re: Скрывающийся виджет.
Отправлено: lighting от Декабрь 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();
   }
 


Название: Re: Скрывающийся виджет.
Отправлено: nike1987 от Декабрь 15, 2011, 12:35
Ну так и в чем проблема? Тогда вообще просто анимируйте положение вашего 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();
   }
 

Проблема таже, панель убирается, но фон при этом остаётся. Можн кнечн добавить после setVisible, но это не совсем то что нужно.


Название: Re: Скрывающийся виджет.
Отправлено: popper от Декабрь 15, 2011, 15:01
Попробуй анимировать QSplitter


Название: Re: Скрывающийся виджет.
Отправлено: lighting от Декабрь 15, 2011, 16:32
Проблема таже, панель убирается, но фон при этом остаётся. Можн кнечн добавить после setVisible, но это не совсем то что нужно.
Какой фон остаеться?  :-\
Насколько я понял вашу задачу у вас есть QGraphiscView растянутый на все окно, и поверх него есть ваш toolbar. Если так то не понятно что за фон у вас там остается. Или GraphicsView занимает не весе окно, а оно разделено между вьювом и тулбаром? Если так то помимо анимации тулбара добавьте анимацию geometry для GraphicsView и запустите их в вместе в QParallelAnimationGroup