Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: FlexoID от Май 26, 2009, 15:25



Название: Полностью рисованный 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 );
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);
...

и все - при движении мауса и кликаньи его  батонов будешь приходить в соответствующие обработчики айтема.
А дальше уже делай там что тебе надо.