Найти - Пользователи
Полная версия: SIGNAL("clicked()") QLabel и QSignalMapper
Начало » GUI » SIGNAL("clicked()") QLabel и QSignalMapper
1
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)

Подскажите если знает кто? Причем если заменить Лейбл заменить на ТулБаттон то все работает нормально(
ValeriyB
Советую использовать новый стиль сигналов / слотов http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/new_style_signals_slots.html
FishHook
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()”))
заработает?
reclosedev

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_())
degid
Уже давно юзаю способ с наследником QLabel, но как в этом примере организовать передачу координат курсора в showUnit?
Координаты которые можно получить в mouseReleaseEvent - e.x() и e.y()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB