Пример, как можно сделать QLabel кликабельный

Пример, как можно сделать QLabel кликабельный

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

Архив с исходниками Вы можете скачать отсюда, или можете ознакомится с моей инструкцией, в которой я постарался подробно рассказать, что нужно сделать, чтобы изображение стало интерактивным (кликабельным).. Начнем с места, где вы столкнулись с проблемой. Вы нашли замечательное изображение для кнопки и хотите добавить его в свой интерфейс (GUI). Как вы знаете, лучший путь сделать это, просто добавить QLabel. Вы соединяете слоты и сигналы и запускаете вашу программу, кликаете на изображении, но ничего не происходит. Почесывая затылок, Вы спрашиваете себя «Что же я пропустил?».
Посмотрим, как примерно выглядит ваш код:

MainUI.py

QT Widget с небольшим изображением, по которому мы хотим кликать.

Main.py

Это основной класс. Я полагаю, особо, комментировать этот код не смысла. Мы импортируем необходимые вещи и наш класс MainUi. Инициализируем QApplication  и показываем MainUi.

Выглядит, как будто это может работать, но это не так. Причина в том, что QLabel не формирует сигнал clicked(). Давайте посмотрим, как это можно исправить!

Как сделать изображение кликабельным

Для включения сигнала на клик, мы должны расширить QLabel  и создать собственный класс Label . Вы можете его назвать как хотите, я же назвал его ExtendedLabel и он реализован ниже.

ExtendedQLabel.py

Этот класс расширяет QLabel. Он перехватывает mouseReleaseEvent  и формирует сигнал “clicked()”. Сейчас мы можем соединить сигнал и сделаем QLabel  кликабельным.

Что мы сделали: мы взяли QLabel  и добавили метод, который ловит mouseReleaseEvent. Этот метод формирует сигнал “clicked()”, который обычно есть у кнопок. Сейчас ExtendedLabel  можно использовать как кнопку.

MainUi.py

Давайте вернемся к нашему классу MainUi. Импортируем ExtendedQLabel и заменим обычный QLabel на улучшенный вариант ExtendedQlabel. Событие “clicked()” в ExtendedLable  сейчас связано с методом buttonClicked().

Сейчас, когда мы кликнем на изображении, сформируется сигнал clicked(), и пока он связан с методом buttonClicked(), метод будет вызываться.

Дальнейшее расширение QLabel

Что мы можем сделать еще? Сейчас я вам покажу, как можно поймать другие события мышки, например от колесика. \

Что мы можем сделать еще? Я просто покажу вам, как могут быть обработаны другие события от мышки, на примере, в котором обрабатываются события от колеса мышки.В основном это сделано так же, как мы делали до этого. Однако, в случае с колесиком от мыши, было бы неплохо отправить направление и насколько шагов был сделан скроллинг.

ExtendedQLabel.py

Начнем с нашего расширенной QLabel. Помимо кода, который был написан ранее, добавили метод wheelEvent, который обрабатывает события от колесика. В этом методе мы генерируем сигнал с параметром, который содержит направление и количество шагов скроллинга.

 

MainUi.py

Нам нужно соединить сигналы скроллинка с слотом в MainUi. Код ниже показывает, как сигнал соединен с wheelScrolled(), когда изображение и окно изменяют размер в зависимости от scrollAmount. Я не стал делать масштабирование изображения пропорциональным, т.к. выглядит это не очень хорошо. Так же, я сделал содержимое QLabel и изменяемым размером.

 

Заключение

Как видно, QLabel может быть легко расширена на перехват и формирование сигналов. Можно задать вопрос, почему QLabel не формирует сигнал clicked() в начальном варианте, ведь многие программисты столкнулись с этой проблемой и искали ее решение. Надеюсь данный пример будет полезным.

оригинальная статья

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *