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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QToolTip немедленно и независимо от кнопок  (Прочитано 9243 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Март 18, 2015, 21:58 »

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

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

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

Можно, конечно, QDrag с картинкой привесить, это не вопрос. Но во-первых, это довольно громоздко, во-вторых, хотелось использовать то, что уже есть, не порождать лишнюю сущность. Да и как-то неуправляемость этого тултипа... раздражает.
« Последнее редактирование: Март 18, 2015, 22:08 от Гурман » Записан

2^7-1 == 127, задумайтесь...
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Март 18, 2015, 22:25 »

А чем способ с QDrag с картинкой плох?

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

        drag->setPixmap(pixmap);

Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Март 18, 2015, 22:33 »

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

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

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #3 : Март 18, 2015, 23:50 »

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

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #4 : Март 18, 2015, 23:59 »

Зачем вы берёте прекрасный компонент для показа сообщений и пытаетесь его отхачить в самостоятельный двигающийся виджет?
Проще свой виджет написать.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #5 : Март 19, 2015, 00:24 »

Проще 2 строки, которые должны согласно документации работать,  или целый виджет городить?
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #6 : Март 19, 2015, 08:13 »

Вы сами говорите что они не так работают Веселый
Невозможно все случаи предусмотреть, иногда приходится и своё писать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Март 19, 2015, 08:30 »

Проще 2 строки, которые должны согласно документации работать,  или целый виджет городить?
Попытки приспособить стандартную вещь для своих (других) целей как правило неудачны. Время съедается а результата можно и не добиться. "Целый виджет" в этом плане надежнее - тут рез-т точно будет.

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

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #8 : Март 19, 2015, 12:19 »

Вы сами говорите что они не так работают Веселый
Невозможно все случаи предусмотреть, иногда приходится и своё писать.

Ну... еще один случай, когда работает не в соответствии с документацией. В замешательстве

Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Март 19, 2015, 12:23 »

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

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

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Март 19, 2015, 12:40 »

Тем более, что легальность копирования цельного класса не очевидна с точки зрения LGPL.
Не надо ничего копировать, все что вы хотите делается с нуля за час. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Март 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. Ну и чего сидим?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Март 19, 2015, 13:01 »

Нет, это не годится. Я сделаю свой простой класс, простой лейбл для размещения на QGraphicsScene. Побочный положительный эффект - если сцену надо будет проскроллировать, все зажженные лейблы будут перемещаться вместе с объектами.
« Последнее редактирование: Март 20, 2015, 00:59 от Гурман » Записан

2^7-1 == 127, задумайтесь...
fdfsdfgjfh
Гость
« Ответ #13 : Март 19, 2015, 22:11 »

Также думаю над этим вопросом, т.к мне нужен тултип для всех объектов когда я их перемещаю мультисилектом.
Но пока не хватает времени для реализации собственного класса для tooltip.
Буду очень признателен, если кто-нибудь подскажет откуда взять базовую часть.
Записан
Bepec
Гость
« Ответ #14 : Март 20, 2015, 00:02 »

Ваш тултип это QLabel с рамочкой) Просто надо его привязать к перемещаемому объекту каким то способом. Это если быстро и просто.

Посложнее самому отрисовывать текст, но на мой взгляд это уже изврат Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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