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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Полностью рисованный GUI  (Прочитано 8978 раз)
FlexoID
Гость
« : Май 26, 2009, 15:25 »

Планирую создать программу, что-то типо виджета (информационное окошко на рабочем столе), с рисованным графическим интерфейсом, а именно само окно произвольной формы и элементы на нем. Подскажите, как это удобнее и правильнее сделать? Опыта в написании приложений на Qt не имею, поэтому боюсь, что не туда двинусь. Пока вроде планирую использовать QGraphicsView и QGraphicsItem для окна и элементов соответственно. Еще в планах создание поддержки скинов для программы, возможно это как-то должно повлиять на выбор способа реализации.
Вобщем скидывайте все советы что есть, любая помощь будет полезна, пока программа на этапе обдумывания. Буду благодарен.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Май 26, 2009, 15:58 »

Посмотрите на исходники программы QtDemo - там как раз нестандартный интерфейс и если я не путаю сделан через QGraphicsView
Записан
Rcus
Гость
« Ответ #2 : Май 26, 2009, 16:02 »

http://doc.qtsoftware.com/qq/index.html QQ29. Еще можно посмотреть на реализацию плазмы (гыгы plasma love and hate). А скины... KStyle обеспечивает довольно хорошую базу для изменения стилей (в чистом QStyle учесть все задача еще та)
/* думает поменять подпись на kde brain corruption Улыбающийся */
Записан
FlexoID
Гость
« Ответ #3 : Май 26, 2009, 16:16 »

Спасибо за советы. Я так подумал, думаю систему смены скинов можно даже не учитывать, поскольку у меня, вроде как, в этой проге будет само окно, текст и может быть кнопка-другая. Всякие настройки и прочее реализуется через стандартный ГУЙ. А это, грубо говоря, пару картинок...
Записан
Valeriy
Гость
« Ответ #4 : Май 26, 2009, 20:02 »

По-моему, я в линуксформате видел статью, где были примеры того как виджеты встраиваются в QGraphicsScene. http://www.opennet.ru/docs/RUS/qt4_intro/ . Четвёртая статья.

Сам я писал свой виджет, наследуя QGraphicsView и перегружая mousePressEvent, но, кажется, есть возможность отлавливать события уже на уровне QGraphicsItem'ов без необходимости самостоятельно разбираться, над каким виджетом мышка была.
Записан
FlexoID
Гость
« Ответ #5 : Май 28, 2009, 19:19 »

Вобщем, наступил на грабли. Пишу пока так: наследник QGraphicsView + QGraphicsScene <-- наследники QGraphicsItem (элементы)

В QGraphicsView переопределяю mousePressEvent и другие, реализую перетаскивание окна. Все отлично.

В QGraphicsItem переопределяю mousePressEvent - сообщения даже не доходят. Что делать, как быть?
Записан
Valeriy
Гость
« Ответ #6 : Май 28, 2009, 20:13 »

> В QGraphicsView переопределяю mousePressEvent и другие, реализую перетаскивание окна.

Возможно, в этом и проблема. Ты мог экранировать передачу события от View к Scene и сигнал дальше не проходит.
Записан
FlexoID
Гость
« Ответ #7 : Май 28, 2009, 20:22 »

Ну это я и так понял. Вопрос в том, как этого избежать?..
Записан
Valeriy
Гость
« Ответ #8 : Май 28, 2009, 20:53 »

void MyView::mousePressEvent(QMouseEvent *event)
{
        .............
        QGraphicsView::mousePressEvent(event);
}
Записан
FlexoID
Гость
« Ответ #9 : Май 28, 2009, 21:12 »

Нее, это что-то не то помоему.
Записан
Valeriy
Гость
« Ответ #10 : Май 28, 2009, 22:54 »

Прибейте перегрузку mousePressEvent для View, и если сигнал доходить не будет, значит у Вас где-то ошибка. Есть несколько способов отрубить поступление сигнала к итемам.

А вышепреведённый код мне помог возобновить передачу сигнала.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #11 : Май 28, 2009, 22:56 »

Цитировать
Нее, это что-то не то помоему.

НепонимающийНепонимающий? что значит не по твоему? Ты пишешь на C++ и не хочешь использовать его базовые концепции (вызов наследником базового виртуального метода)Непонимающий
Записан
FlexoID
Гость
« Ответ #12 : Май 29, 2009, 06:29 »

Valeriy, да, вы правы, я не правильно понял. Все заработало.
Вот только есть еще вопрос: как определить, что под курсором есть еще объект, т.е. не реагировать в View на нажатия по Item'ам. Какую проверку делать в event'е View'а?
Записан
Valeriy
Гость
« Ответ #13 : Май 29, 2009, 16:36 »

Вообще, перехват события на уровне View - это не очень хорошо с точки зрения соответствия MVC. Лучше всё делать на уровне Scene, там аналогичный метод можно перегрузить. Вообще лучше как можно больше делать на уровне Item'ов.

http://doc.trolltech.com/4.5/qgraphicsscene.html#itemAt  -- item под координатами.
Записан
mal
Гость
« Ответ #14 : Июнь 01, 2009, 21:04 »

надо курить сюда:   Подмигивающий
у айтема переопределить event'ы (то что тебе конкретно надо подчеркнешь)
Код:
void hoverEnterEvent ( QGraphicsSceneHoverEvent * event );
void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event );
void mousePressEvent ( QGraphicsSceneMouseEvent * event );
void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
void mouseReleaseEvent ( QGraphicsSceneMouseEvent * mouseEvent );

при создании айтема сказать ему чтоб он принимал hover- евенты и проч.
Код:
item->setAcceptsHoverEvents(true);
item->setFlag(QGraphicsItem::ItemIsFocusable,true);
item->setFlag(QGraphicsItem::ItemIsMovable,true);
...

и все - при движении мауса и кликаньи его  батонов будешь приходить в соответствующие обработчики айтема.
А дальше уже делай там что тебе надо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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