Найти в Дзене
programmer's notes (python and more)

Программирование на языке Python. Библиотека PyQt5 и создание всплывающих подсказок

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Создание всплывающих подсказок на PyQt5

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

И так, что такое подсказка? Да самое обычное окно. Ну в PyQt5 в общем то всё можно строить на основе окон. Единственно, что можно отметить, у такого окна нет заголовка. Но это оказывается совсем не проблема. Далее, такое окно должно появляться вблизи курсора мыши, когда этот курсор идёт над элементом окна. Это тоже не сложно и реализовать это можно разными способами. Ну и обычно у таких подсказок есть время жизни по прошествии которого подсказка исчезает. И здесь не сложно, а для чего мы таймер изучали?

Ниже представлена программа: окно с одной кнопкой. При наведении курсором мыши на кнопку появляется подсказка (см. Рисунок 1).

Скриншот программы. Полный текст программы см. ниже по ссылке
Скриншот программы. Полный текст программы см. ниже по ссылке
primer256.py

Пояснение к программе.

  • Создание окна для нас дело знакомое и я это не обсуждаю. Для кнопки создан отдельный класс - наследник QPushButton. тут вот на что следует внимание обратить. Обработчики enterEvent() - срабатывает когда курсор мыши заходит на элемент и leaveEvent() - срабатывает. когда курсор мыши уходит с элемента. Как раз то, что нам нужно. Можно и по другому, но поищите решение сами.
  • При заходе на кнопку создаётся окно из готового класса wtip и указываются координаты мыши и надпись на подсказке. Кстати обращу внимание на класс QCursor. При срабатывании leaveEvent() окно подсказки закрывается.
  • Теперь будем рассматривать класс wtip. Прежде всего обращу внимание на метод QWidget.setWindowFlags(Qt.FramelessWindowHint). Этим методом удаляется заголовок окна.
  • Строки
    self.tm = QTimer()
    self.tm.setTimerType(Qt.VeryCoarseTimer)
    self.tm.timeout.connect(self.close)
    self.tm.start(5000)

    должны быть понятны. Они создают таймер, который закроет окно через 5 секунд.
  • Самое важно событие paintEvent(). Оно срабатывает при перерисовке окна. Первый раз оно срабатывает при создании окна. Но нам это только и нужно. По этому событию посмотрите здесь и здесь.
  • Что здесь для нас важно? Определить ширину окна, чтобы вошёл текст. Мы решили, что подсказки будут однострочные, чтобы сильно программу не усложнять. Но если поймёте, как здесь всё это работает, сделать многострочную подсказку нет никаких проблем. И так, текст, который будет в подсказке передаётся, когда создаётся объект - окно wtip. Нам нужно во-первых создать объект QFont с заданием параметров шрифта. Во-вторых, создать объект класса QFontMetrics. И далее с помощью методов этого объекта определяем ширину и высоту строки (wx, hy).
  • Для вывода текста создаём объект QRect. Ну, а далее выводим текст с помощью метода QPainter.drawText().
  • Ну и последний штрих. Задаём окончательные размеры окна на основе размеров текста с помощью setFixedSize().
Рисунок 1. Пример собственной всплывающей подсказки
Рисунок 1. Пример собственной всплывающей подсказки

Ну, пока всё!

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

Обойдёмся без ваших подсказок
Обойдёмся без ваших подсказок