Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Гурман от Март 18, 2015, 21:58



Название: QToolTip немедленно и независимо от кнопок
Отправлено: Гурман от Март 18, 2015, 21:58
Сделал собственное перетаскивание объектов по сцене, надо чтобы во время таскания рисовался тултип с подсказкой, что за объект тащим. Может еще что-то полезное туда дописать. Использовал по-простому
Код:
QToolTip::showText( QCursor::pos(), toolTip() );
где toolTip() возвращает текст, ранее установленный в тултип объекта.

Вызываю это дело в виртуальном методе
Код:
mouseMoveEvent(QGraphicsSceneMouseEvent *event)
который собственно определяет - драгается ли объект, и когда драгается, то возит его по сцене. Объект в нём драгается, с объектом всё хорошо, стартует где надо, падает где надо. Но тултип, сволочь... Появляется только там, где начато движение. Во время движения стоит на месте, хотя координата QCursor::pos() все время меняется. Если остановиться, не отпуская мышь, то тултип через некоторое время исчезает. И, сволочь такая, появляется там, откуда снова начато движение, и там и висит... А надо, чтобы он всё время под объектом ездил. В доках не нашел ничего про то, можно ли стратегию тултипа поменять. Можно ли ему убрать временную задержку, заставить его рисоваться сразу и убираться немедленно, если его рисуют на новом месте. К тултипу, который "встроен" в QGraphicsItem, вообще никакого доступа не видно, ему можно только установить строку и получить строку.

Может я что-то пропустил? Есть способ заставить тултип рисоваться всегда в позиции курсора и следовать за ним?

Можно, конечно, QDrag с картинкой привесить, это не вопрос. Но во-первых, это довольно громоздко, во-вторых, хотелось использовать то, что уже есть, не порождать лишнюю сущность. Да и как-то неуправляемость этого тултипа... раздражает.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: PimenS от Март 18, 2015, 22:25
А чем способ с QDrag с картинкой плох?

Код:
        QLabel lab("Text");
        QPixmap pixmap(lab.size());
        lab.render(&pixmap);

        drag->setPixmap(pixmap);



Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Гурман от Март 18, 2015, 22:33
Тем, что не работает. Только что проверял - либо QDrag, либо айтем самому таскать можно. То есть, стоит запустить QDrag::exec() - айтем перестает рисоваться. После запуска QDrag::exec() повторного входа в mouseMoveEvent(QGraphicsSceneMouseEvent *event) уже не происходит. Не удивительно, поскольку QDrag реализован "системными" средствами, которые с Qt-шным mouseMoveEvent(QGraphicsSceneMouseEvent *event) никак не связаны. И QDrag - это черный ящик, в который вмешаться во время таскания никак невозможно.

То есть, QDrag не годится. По простому остается только отхачить QToolTip. Либо по-сложному... картинку самому возить за курсором, и менять её на ходу (навскидку выглядит маразматически, поскольку нужен только текст). Или что-то еще выдумывать.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Гурман от Март 18, 2015, 23:50
Вот же шайтан... В доке написано, для того чтобы тултип двигался, надо его очищать вызовом QToolTip::hideText(); и тогда он таки двигается. Но только тогда, когда двигается курсор. Стоит остановить движение, тултип исчезает, хотя у меня сначала вызов hideText, потом showText.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Bepec от Март 18, 2015, 23:59
Зачем вы берёте прекрасный компонент для показа сообщений и пытаетесь его отхачить в самостоятельный двигающийся виджет?
Проще свой виджет написать.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Гурман от Март 19, 2015, 00:24
Проще 2 строки, которые должны согласно документации работать,  или целый виджет городить?


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Bepec от Март 19, 2015, 08:13
Вы сами говорите что они не так работают :D
Невозможно все случаи предусмотреть, иногда приходится и своё писать.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Igors от Март 19, 2015, 08:30
Проще 2 строки, которые должны согласно документации работать,  или целый виджет городить?
Попытки приспособить стандартную вещь для своих (других) целей как правило неудачны. Время съедается а результата можно и не добиться. "Целый виджет" в этом плане надежнее - тут рез-т точно будет.

Я бы попробовал передрать тот же тултип из исходников. Открываем QToolTop.cpp. Ага, вот закрытый класс QTipLabel. Копируем его к себе и вырезаем все ненужное (таймеры там всякие). Полчаса (с перекурами).


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Гурман от Март 19, 2015, 12:19
Вы сами говорите что они не так работают :D
Невозможно все случаи предусмотреть, иногда приходится и своё писать.

Ну... еще один случай, когда работает не в соответствии с документацией. :-\



Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Гурман от Март 19, 2015, 12:23
Я бы попробовал передрать тот же тултип из исходников. Открываем QToolTop.cpp. Ага, вот закрытый класс QTipLabel. Копируем его к себе и вырезаем все ненужное (таймеры там всякие). Полчаса (с перекурами).

Не, поскольку тултип по задаче должен появляться только возле объектов на QGraphicsScene, то проще действительно сделать свой лейбл. Тем более, что дальше по задаче мне надо будет зажигать одновременно несколько тултипов у объектов сцены. А Qt-шный может быть только один, возможно его придётся серьезно переделывать, чтобы разрешить несколько, а может и вообще невозможно (он похоже "системный", как QDrag). Тем более, что легальность копирования цельного класса не очевидна с точки зрения LGPL.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Old от Март 19, 2015, 12:40
Тем более, что легальность копирования цельного класса не очевидна с точки зрения LGPL.
Не надо ничего копировать, все что вы хотите делается с нуля за час. :)


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Igors от Март 19, 2015, 12:48
Тем более, что легальность копирования цельного класса не очевидна с точки зрения LGPL.
Ну Вам же сказали "порезать". Вот собственно что нужно
Код
C++ (Qt)
void QTipLabel::paintEvent(QPaintEvent *ev)
{
   QStylePainter p(this);
   QStyleOptionFrame opt;
   opt.init(this);
   p.drawPrimitive(QStyle::PE_PanelTipLabel, opt);
   p.end();
 
   QLabel::paintEvent(ev);
}
 
И там вверху еще установить палетку и глянуть resizeEvent. Ну и чего сидим?


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Гурман от Март 19, 2015, 13:01
Нет, это не годится. Я сделаю свой простой класс, простой лейбл для размещения на QGraphicsScene. Побочный положительный эффект - если сцену надо будет проскроллировать, все зажженные лейблы будут перемещаться вместе с объектами.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: fdfsdfgjfh от Март 19, 2015, 22:11
Также думаю над этим вопросом, т.к мне нужен тултип для всех объектов когда я их перемещаю мультисилектом.
Но пока не хватает времени для реализации собственного класса для tooltip.
Буду очень признателен, если кто-нибудь подскажет откуда взять базовую часть.


Название: Re: QToolTip немедленно и независимо от кнопок
Отправлено: Bepec от Март 20, 2015, 00:02
Ваш тултип это QLabel с рамочкой) Просто надо его привязать к перемещаемому объекту каким то способом. Это если быстро и просто.

Посложнее самому отрисовывать текст, но на мой взгляд это уже изврат :D