Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: trump от Июль 07, 2014, 17:19



Название: QScriptEngineDebugger перехват подсказок.
Отправлено: trump от Июль 07, 2014, 17:19
Если в окне кода QScriptEngineDebugger навести мышь на переменную, то появится подказка в виде значения этой переменной.

Можно ли без перекомпиляции QT перехватывать эту подсказку?


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: Old от Июль 07, 2014, 17:42
Что значит перехватывать? Получать сообщение из tooltip, блокировать tooltip?
В большинстве вариантов поможет eventFilter.


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: trump от Июль 08, 2014, 12:17
Получить сообщение из Tooltip, изменить его, показать уже измененное.


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: Old от Июль 08, 2014, 12:28
Получить сообщение из Tooltip, изменить его, показать уже измененное.
Как выше написано, попробуйте использовать фильтры событий (eventFilter).


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: trump от Июль 08, 2014, 12:35
Как выше написано, попробуйте использовать фильтры событий (eventFilter).

Ну я могу установить фильтр.

Код:
bool eventFilter(QObject* object,QEvent* event)
  {
      if(event->type() == QEvent::ToolTip)
      {
          QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);

          return true;
      }
      else
      {
            return QObject::eventFilter(object,event);
      }
  };

Как добраться до текста тултипа?


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: Old от Июль 08, 2014, 13:01
QToolTip::text()

Это статический метод.


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: trump от Июль 08, 2014, 13:16
QToolTip::text()

Это статический метод.

Это в данном случае не работает, но всё-равно спасибо.


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: Old от Июль 08, 2014, 14:22
Это в данном случае не работает, но всё-равно спасибо.
Возвращает пустую строку?


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: trump от Июль 08, 2014, 14:30
Это в данном случае не работает, но всё-равно спасибо.
Возвращает пустую строку?

Да. :(


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: Old от Июль 08, 2014, 14:34
Да. :(
Возможно, в момент срабатывания tooltip, а точнее instance QTipLabel еще не создано?
Можно попробовать вызвать обработчик eventFilter базового класса и после его отработки проверить значение.


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: trump от Июль 08, 2014, 15:07
QObject::eventFilter нормально отрабатывает, появляется тултип, но QToolTip::text всё-равно возвращает пустую строку.
Но если пока тултип одной переменной показывается, резко перевести курсор на другую переменную, то QToolTip::text начинает возвращать нужное значение. Если убрать курсор мыши за границы окна и опять навести на переменную, то QToolTip::text опять начинает возвращать пустую строку.

Код:
bool eventFilter(QObject* object,QEvent* event)
  {
      if(event->type() == QEvent::ToolTip)
      {
          //QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
          QString sToolTip;
         
          sToolTip=QToolTip::text();
          qDebug(sToolTip.toAscii().data());
         
          QObject::eventFilter(object,event);
         
          sToolTip=QToolTip::text();
          qDebug(sToolTip.toAscii().data());

          return true;

      }
      else
      {
          return QObject::eventFilter(object,event);
      }

  };


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: Old от Июль 08, 2014, 15:56
Скорее всего для полной подготовки и отображения tooltip, нужно крутануть цикл обработки событий.
Чуть позже доберусь до компьютера и покажу одну мысль.


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: Old от Июль 08, 2014, 18:02
Предлагаю попробовать следующую конструкцию:

Код
C++ (Qt)
bool Tracker::eventFilter(QObject* object,QEvent* event)
{
     if(event->type() == QEvent::ToolTip)
     {
           bool ret = QObject::eventFilter(object,event);
           QMetaObject::invokeMethod( this, "checkToolTip", Qt::QueuedConnection );
           retrun ret;
     }
     return QObject::eventFilter(object,event);
}
 
void Tracker::checkToolTip()
{
      qDebug() << QToolTip::text();
}
 

Описать дополнительный слот checkToolTip, который будет вызываться через очередь событий.


Название: Re: QScriptEngineDebugger перехват подсказок.
Отправлено: trump от Июль 09, 2014, 10:22
Спасибо за код!
Но ничего не изменилось. :(
Придется видимо перекомпилировать QT.