Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 19, 2012 12:38:57

ragnarek
От:
Зарегистрирован: 2012-02-13
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

SIGNAL("clicked()") QLabel и QSignalMapper

Доброго времени суток, имею неудовольствие столкнуться с проблемой, решение которой лежит вне области моего восприятия.

for i in range(len(Units.modules.values())):
                unit = Units.modules.values()[i]
                label = QLabel(unit.label) #Cоздаю Лейбл
                label.mouseReleaseEvent = lambda x: label.emit(SIGNAL("clicked()")) #Прикручиваю к нему кликед, ибо нет родного...возможно тут я в чем то не прав.
                self.connect(label, SIGNAL("clicked()"), signalMapper, SLOT("map()")) #загружаю в маппер
                self.connect(label, SIGNAL("clicked()"), partial(self.showUnit,0)) #этот код для проверки, кликед срабатывает, но только тут
                signalMapper.setMapping(label,i) # Прикрепляю ответ
                label.setStyleSheet("QLabel::hover{background-color:red}") #это так...не по теме
                label.setMinimumSize(100,50) #и это
                menuLayout.addWidget(label) 
                self.loadedUnits[i]=unit
        self.connect(signalMapper, SIGNAL("mapped(int)"), self.showUnit) #Тут мониторю маппер
def showUnit(self,args):
        print(args)

Подскажите если знает кто? Причем если заменить Лейбл заменить на ТулБаттон то все работает нормально(



Офлайн

#2 Апрель 19, 2012 12:44:09

ValeriyB
Зарегистрирован: 2012-04-10
Сообщения: 26
Репутация: +  1  -
Профиль   Отправить e-mail  

SIGNAL("clicked()") QLabel и QSignalMapper

Советую использовать новый стиль сигналов / слотов http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html

Офлайн

#3 Апрель 19, 2012 17:00:07

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

SIGNAL("clicked()") QLabel и QSignalMapper

ragnarek
Доброго времени суток, имею неудовольствие столкнуться с проблемой, решение которой лежит вне области моего восприятия.
for i in range(len(Units.modules.values())):
                unit = Units.modules.values()[i]
                label = QLabel(unit.label) #Cоздаю Лейбл
                label.mouseReleaseEvent = lambda x: label.emit(SIGNAL("clicked()")) #Прикручиваю к нему кликед, ибо нет родного...возможно тут я в чем то не прав.
                self.connect(label, SIGNAL("clicked()"), signalMapper, SLOT("map()")) #загружаю в маппер
                self.connect(label, SIGNAL("clicked()"), partial(self.showUnit,0)) #этот код для проверки, кликед срабатывает, но только тут
                signalMapper.setMapping(label,i) # Прикрепляю ответ
                label.setStyleSheet("QLabel::hover{background-color:red}") #это так...не по теме
                label.setMinimumSize(100,50) #и это
                menuLayout.addWidget(label) 
                self.loadedUnits[i]=unit
        self.connect(signalMapper, SIGNAL("mapped(int)"), self.showUnit) #Тут мониторю маппер
def showUnit(self,args):
        print(args)

Подскажите если знает кто? Причем если заменить Лейбл заменить на ТулБаттон то все работает нормально(

Возможно скажу глупость, но ЕМНИП у ТулБаттона сигнал click выглядит так click(bool=0), то есть принимает параметр
lambda x: label.emit(SIGNAL(“clicked()”))
Если заменить на
lambda : label.emit(SIGNAL(“clicked()”))
заработает?



Офлайн

#4 Апрель 19, 2012 18:59:38

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

SIGNAL("clicked()") QLabel и QSignalMapper


ValeriyB
Советую использовать новый стиль сигналов / слотов http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html
Поддерживаю.

Я бы на вашем месте сделал наследника QLabel с полноценным сигналом. Примерно вот так:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore, QtGui
 
class ClickableLabel(QtGui.QLabel):
    clicked = QtCore.pyqtSignal()
 
    def mouseReleaseEvent(self, e):
        QtGui.QLabel.mouseReleaseEvent(self, e)
        self.clicked.emit()
 
 
class MainWidget(QtGui.QWidget):
 
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.signalMapper = QtCore.QSignalMapper()
        layout = QtGui.QVBoxLayout()
        for i in range(10):
            label = ClickableLabel('Label %s' % i)
            label.clicked.connect(self.signalMapper.map)
            self.signalMapper.setMapping(label, i)
            layout.addWidget(label)
        self.signalMapper.mapped.connect(self.showUnit)
        self.setLayout(layout)
 
    def showUnit(self, args):
        print(args)
 
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MainWidget()
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())

Офлайн

#5 Янв. 14, 2016 07:38:09

degid
От: Ясиноватая
Зарегистрирован: 2012-12-04
Сообщения: 49
Репутация: +  1  -
Профиль   Отправить e-mail  

SIGNAL("clicked()") QLabel и QSignalMapper

Уже давно юзаю способ с наследником QLabel, но как в этом примере организовать передачу координат курсора в showUnit?
Координаты которые можно получить в mouseReleaseEvent - e.x() и e.y()



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version