Название: Полностью рисованный GUI Отправлено: FlexoID от Май 26, 2009, 15:25 Планирую создать программу, что-то типо виджета (информационное окошко на рабочем столе), с рисованным графическим интерфейсом, а именно само окно произвольной формы и элементы на нем. Подскажите, как это удобнее и правильнее сделать? Опыта в написании приложений на Qt не имею, поэтому боюсь, что не туда двинусь. Пока вроде планирую использовать QGraphicsView и QGraphicsItem для окна и элементов соответственно. Еще в планах создание поддержки скинов для программы, возможно это как-то должно повлиять на выбор способа реализации.
Вобщем скидывайте все советы что есть, любая помощь будет полезна, пока программа на этапе обдумывания. Буду благодарен. Название: Re: Полностью рисованный GUI Отправлено: break от Май 26, 2009, 15:58 Посмотрите на исходники программы QtDemo - там как раз нестандартный интерфейс и если я не путаю сделан через QGraphicsView
Название: Re: Полностью рисованный GUI Отправлено: Rcus от Май 26, 2009, 16:02 http://doc.qtsoftware.com/qq/index.html QQ29. Еще можно посмотреть на реализацию плазмы (гыгы plasma love and hate). А скины... KStyle обеспечивает довольно хорошую базу для изменения стилей (в чистом QStyle учесть все задача еще та)
/* думает поменять подпись на kde brain corruption :) */ Название: Re: Полностью рисованный GUI Отправлено: FlexoID от Май 26, 2009, 16:16 Спасибо за советы. Я так подумал, думаю систему смены скинов можно даже не учитывать, поскольку у меня, вроде как, в этой проге будет само окно, текст и может быть кнопка-другая. Всякие настройки и прочее реализуется через стандартный ГУЙ. А это, грубо говоря, пару картинок...
Название: Re: Полностью рисованный GUI Отправлено: Valeriy от Май 26, 2009, 20:02 По-моему, я в линуксформате видел статью, где были примеры того как виджеты встраиваются в QGraphicsScene. http://www.opennet.ru/docs/RUS/qt4_intro/ . Четвёртая статья.
Сам я писал свой виджет, наследуя QGraphicsView и перегружая mousePressEvent, но, кажется, есть возможность отлавливать события уже на уровне QGraphicsItem'ов без необходимости самостоятельно разбираться, над каким виджетом мышка была. Название: Re: Полностью рисованный GUI Отправлено: FlexoID от Май 28, 2009, 19:19 Вобщем, наступил на грабли. Пишу пока так: наследник QGraphicsView + QGraphicsScene <-- наследники QGraphicsItem (элементы)
В QGraphicsView переопределяю mousePressEvent и другие, реализую перетаскивание окна. Все отлично. В QGraphicsItem переопределяю mousePressEvent - сообщения даже не доходят. Что делать, как быть? Название: Re: Полностью рисованный GUI Отправлено: Valeriy от Май 28, 2009, 20:13 > В QGraphicsView переопределяю mousePressEvent и другие, реализую перетаскивание окна.
Возможно, в этом и проблема. Ты мог экранировать передачу события от View к Scene и сигнал дальше не проходит. Название: Re: Полностью рисованный GUI Отправлено: FlexoID от Май 28, 2009, 20:22 Ну это я и так понял. Вопрос в том, как этого избежать?..
Название: Re: Полностью рисованный GUI Отправлено: Valeriy от Май 28, 2009, 20:53 void MyView::mousePressEvent(QMouseEvent *event)
{ ............. QGraphicsView::mousePressEvent(event); } Название: Re: Полностью рисованный GUI Отправлено: FlexoID от Май 28, 2009, 21:12 Нее, это что-то не то помоему.
Название: Re: Полностью рисованный GUI Отправлено: Valeriy от Май 28, 2009, 22:54 Прибейте перегрузку mousePressEvent для View, и если сигнал доходить не будет, значит у Вас где-то ошибка. Есть несколько способов отрубить поступление сигнала к итемам.
А вышепреведённый код мне помог возобновить передачу сигнала. Название: Re: Полностью рисованный GUI Отправлено: break от Май 28, 2009, 22:56 Цитировать Нее, это что-то не то помоему. ??????? что значит не по твоему? Ты пишешь на C++ и не хочешь использовать его базовые концепции (вызов наследником базового виртуального метода)??? Название: Re: Полностью рисованный GUI Отправлено: FlexoID от Май 29, 2009, 06:29 Valeriy, да, вы правы, я не правильно понял. Все заработало.
Вот только есть еще вопрос: как определить, что под курсором есть еще объект, т.е. не реагировать в View на нажатия по Item'ам. Какую проверку делать в event'е View'а? Название: Re: Полностью рисованный GUI Отправлено: Valeriy от Май 29, 2009, 16:36 Вообще, перехват события на уровне View - это не очень хорошо с точки зрения соответствия MVC. Лучше всё делать на уровне Scene, там аналогичный метод можно перегрузить. Вообще лучше как можно больше делать на уровне Item'ов.
http://doc.trolltech.com/4.5/qgraphicsscene.html#itemAt -- item под координатами. Название: Re: Полностью рисованный GUI Отправлено: mal от Июнь 01, 2009, 21:04 надо курить сюда: ;)
у айтема переопределить event'ы (то что тебе конкретно надо подчеркнешь) Код: void hoverEnterEvent ( QGraphicsSceneHoverEvent * event ); при создании айтема сказать ему чтоб он принимал hover- евенты и проч. Код: item->setAcceptsHoverEvents(true); и все - при движении мауса и кликаньи его батонов будешь приходить в соответствующие обработчики айтема. А дальше уже делай там что тебе надо. |