2012-11-20 2 views
2

QLabels와 QLineEdits가 나란히 포함 된 QWidget이 있습니다. 나는 QLabel을 클릭하면 QWidget이 QLineEdit 대신 마우스 이벤트를 감지 할 수 있습니까?

, 내가는 QWidget에서 mousePressEvent를 사용할 수 있습니다. 그러나 QLineEdit을 클릭하면 QLidEdit에서만 QWidget에서 mousePressEvent를 감지 할 수 없습니다. QLineEdit의 작동 방식과 관련이 있다고 생각합니다. 전 지역에서 마우스 이벤트를 얻는 방법을 모르겠습니다.

편집 : 나는 위와 같이 마야에 대한 사용자 정의 채널 상자를 만든

enter image description here

. 마우스를 끌어서 여러 채널을 선택하려고합니다. 그러나 QLineEdit 지역에서 언급했듯이 저는 이것을 할 수 없습니다.

class channelWidget(QtGui.QWidget): 
    def __init__(self, parent=None): 
    super(channelWidget, self).__init__(parent) 
    self.resize(180, 20)   
    self.setMinimumSize(180, 20) 
    self.setMaximumHeight(20) 
    self.attr_label = QtGui.QLabel(self) 
    self.attr_label.setGeometry(QtCore.QRect(5, 0, 110, 20)) 
    self.attr_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) 
    self.value_field = focusLineEdit(self) 
    self.value_field.setGeometry(QtCore.QRect(120, 0, 60, 20)) 
    self.value_field.setAlignment(QtCore.Qt.AlignLeft|QtCore.Qt.AlignLeading|QtCore.Qt.AlignVCenter) 
    self.value_field.setValidator(QtGui.QDoubleValidator()) 

각 요소는 QLabel과 QLineEdit로 구성됩니다.

class channelContainerWidget(QtGui.QWidget): 
    def updateChannel(self, node="", attrList=[]): 
    _l = self.channel_layout 
    _list = [] 
    for w in [_l.itemAt(i).widget() for i in range(_l.count()) if _l.itemAt(i).widget()]: 
     if w in self._selectList: _list.append(str(w.attr_label.text())) 
     sip.delete(w) 

    _selList = [] 
    for _id, at in enumerate(attrList): 
     _item = channelWidget(self) 
     _item.attr_label.setText(at) 
     _item.value_field.setText(value) 
     _l.insertWidget(_id, _item) 

위젯은 위와 같이 작동합니다. QLabel 영역을 클릭하면 마우스 이벤트를 얻을 수 있지만 QLineEdit 영역을 클릭하면 그럴 수 없습니다. 기본적으로 QLabelmousePressEvent을 무시하고 다음 부모까지 거품에 수 있기 때문에

+0

질문이 명확하지 않습니다. 신호와 슬롯을 사용해 보셨습니까? – warunanc

+0

@AmazingSixty 예, SIGNAL 및 SLOT 메서드로 시도했습니다. 하지만 (mouseMoveEvent'에 원하는대로, 그것은 –

+0

이 날이 바로하자 :(') 작동하지 않습니다는 것, 그래서 귀하의 질문에 코드를 붙여 넣습니다 우리가 – warunanc

답변

3

당신이 레이아웃을 포함하는 주요 위젯에서 mousePressEvent()을보고하는 경우, 당신은 QLabel의 클릭을보고있는 이유입니다. 이벤트는 child-> parent에서 위쪽으로 전파됩니다.

QLineEdit 그러나 받아 줄 편집 위젯에 공통 초점 및 기타 다양한 작업을 처리하기 위해, 마우스 프레스를 사용할 필요가 없습니다.

그래서 정말 사람들에게 좋은 선택이 될 수 있습니다 무엇 event filter을 사용하는 것입니다. 이렇게하면 QLineEdit의 하위 클래스를 만들지 않고도 메인 위젯이 다른 위젯에 대한 이벤트를 볼 수 있고 mousePressEvent

이 예제에서는 레이아웃 및 마우스 누름을 감시하고 인쇄 한 다음 이 코드를 테스트 할 때 레이블을 클릭하는 것은 주요 위젯의 인쇄 및 이벤트 필터 모두를 일으키는 것을 볼 수

class Widget(QtGui.QWidget): 

    def __init__(self): 
     super(Widget, self).__init__() 

     self.layout = QtGui.QHBoxLayout(self) 

     self.label = QtGui.QLabel("Label") 
     self.line = QtGui.QLineEdit() 

     self.layout.addWidget(self.label) 
     self.layout.addWidget(self.line)   

     # have this widget (self) watch events for these  
     self.label.installEventFilter(self) 
     self.line.installEventFilter(self) 

    def mousePressEvent(self, event): 
     print "Main Widget Mouse Press" 
     super(Widget, self).mousePressEvent(event) 

    def eventFilter(self, obj, event): 
     # you could be doing different groups of actions 
     # for different types of widgets and either filtering 
     # the event or not. 
     # Here we just check if its one of the layout widgets 
     if self.layout.indexOf(obj) != -1: 
      if event.type() == event.MouseButtonPress: 
       print "Widget click", obj 
       # if I returned True right here, the event 
       # would be filtered and not reach the obj, 
       # meaning that I decided to handle it myself 

     # regardless, just do the default 
     return super(Widget, self).eventFilter(obj, event) 

: 기본 동작은 아무 것도 변경하지합니다. 그러나 기본 편집 mousePressEvent이이를 수용하고 더 이상 전파하지 않으므로 행 편집을 누르면 이벤트 필터 인쇄 명령문 만이 발생합니다.

관련 문제