Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Создание всплывающих подсказок на PyQt5
Не разводите руками, мол есть же средство создания всплывающих подсказок, которые были изложены в этой статье. А что, самим не хотелось разве создать свои собственные подсказки? Ну чтобы понять почувствовать, какие механизмы тут работают.
И так, что такое подсказка? Да самое обычное окно. Ну в PyQt5 в общем то всё можно строить на основе окон. Единственно, что можно отметить, у такого окна нет заголовка. Но это оказывается совсем не проблема. Далее, такое окно должно появляться вблизи курсора мыши, когда этот курсор идёт над элементом окна. Это тоже не сложно и реализовать это можно разными способами. Ну и обычно у таких подсказок есть время жизни по прошествии которого подсказка исчезает. И здесь не сложно, а для чего мы таймер изучали?
Ниже представлена программа: окно с одной кнопкой. При наведении курсором мыши на кнопку появляется подсказка (см. Рисунок 1).
Пояснение к программе.
- Создание окна для нас дело знакомое и я это не обсуждаю. Для кнопки создан отдельный класс - наследник 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 секунд. - Что здесь для нас важно? Определить ширину окна, чтобы вошёл текст. Мы решили, что подсказки будут однострочные, чтобы сильно программу не усложнять. Но если поймёте, как здесь всё это работает, сделать многострочную подсказку нет никаких проблем. И так, текст, который будет в подсказке передаётся, когда создаётся объект - окно wtip. Нам нужно во-первых создать объект QFont с заданием параметров шрифта. Во-вторых, создать объект класса QFontMetrics. И далее с помощью методов этого объекта определяем ширину и высоту строки (wx, hy).
- Для вывода текста создаём объект QRect. Ну, а далее выводим текст с помощью метода QPainter.drawText().
- Ну и последний штрих. Задаём окончательные размеры окна на основе размеров текста с помощью setFixedSize().
Ну, пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.