def eventFilter(self, obj, e: QEvent): """ 安装监听 """ if obj == self: if e.type() == QEvent.Enter: self.songNameCard.checkBox.show() self.songNameCard.buttonGroup.setHidden(self.isInSelectionMode) state = "selected-enter" if self.isSelected else "notSelected-enter" self.setWidgetState(state) self.setStyle(QApplication.style()) elif e.type() == QEvent.Leave: # 不处于选择模式下时,如果歌曲卡没被选中而鼠标离开窗口就隐藏复选框和按钮组窗口 if not self.isSelected: self.songNameCard.buttonGroup.hide() self.songNameCard.checkBox.setHidden( not self.isInSelectionMode) state = "selected-leave" if self.isSelected else "notSelected-leave" self.setWidgetState(state) self.setStyle(QApplication.style()) elif e.type() == QEvent.MouseButtonPress: state = "selected-pressed" if self.isSelected else "notSelected-pressed" if e.button() == Qt.LeftButton: self.isSelected = True self.setWidgetState(state) self.setStyle(QApplication.style()) elif e.type() == QEvent.MouseButtonRelease and e.button( ) == Qt.LeftButton: self.setWidgetState("selected-leave") self.setCheckBoxBtLabelState("selected") # 鼠标松开时将设置标签为白色 self.setStyle(QApplication.style()) elif e.type() == QEvent.MouseButtonDblClick: self.isDoubleClicked = True return super().eventFilter(obj, e)
def eventFilter(self, watched: QObject, event: QEvent) -> bool: pos = tuple(map(int, self._posModel.cursorPos[:2])) if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Space: # Bring to front and select the box at the bottom of the stack. items = watched.scene().items(QPointF(*pos)) rects = [item for item in items if isinstance(item, QGraphicsResizableRect)] if len(rects) > 1: rects[-1].setZValue(rects[0].zValue() + 1) rects[0].setSelected(False) rects[-1].setSelected(True) elif event.type() == QEvent.KeyPress and event.key() == Qt.Key_Control: QApplication.setOverrideCursor(Qt.OpenHandCursor) elif event.type() == QEvent.KeyRelease and event.key() == Qt.Key_Control: QApplication.restoreOverrideCursor() elif event.type() == QEvent.MouseButtonPress and event.button() == Qt.LeftButton: # Start new box rectangle. self._origin = QPoint(event.pos()) self._originPos = pos self._rubberBand.setGeometry(self._origin.x(), self._origin.y(), 0, 0) items = watched.scene().items(QPointF(*pos)) handles = [item for item in items if isinstance(item, ResizeHandle)] modifiers = QApplication.keyboardModifiers() if modifiers != Qt.ControlModifier and modifiers != Qt.ShiftModifier and not handles: self._rubberBand.show() elif event.type() == QEvent.MouseMove: if self._rubberBand.isVisible(): # Resize new box rectangle. self._rubberBand.setGeometry( min(self._origin.x(), event.pos().x()), min(self._origin.y(), event.pos().y()), abs(self._origin.x() - event.pos().x()), abs(self._origin.y() - event.pos().y()), ) elif event.type() == QEvent.MouseButtonRelease and event.button() == Qt.LeftButton: if self._rubberBand.isVisible(): # Finish new box rectangle. self._rubberBand.hide() self.boxDrawn.emit(roi2rect(self._originPos, pos)) self._origin = None self._originPos = None return self._base.eventFilter(watched, event)
def editorEvent( self, event: QtCore.QEvent, model: QtCore.QAbstractItemModel, option: QStyleOptionViewItem, index: QtCore.QModelIndex, ) -> bool: if not (index.flags() & Qt.ItemIsEditable) != 0: return False if event.type() == QEvent.MouseButtonRelease or event.type( ) == QEvent.MouseButtonDblClick: if event.button() != Qt.LeftButton or not self.get_checkbox_rect( option).contains(event.pos()): return False if event.type() == QEvent.MouseButtonDblClick: return True elif event.type() == QEvent.KeyPress: if event.key() != Qt.Key_Space and event.key() != Qt.Key_Select: return False else: return False self.setModelData(None, model, index) return True
def eventFilter(self, source, event: QtCore.QEvent): if source is self._scene: if event.type() == QtCore.QEvent.GraphicsSceneMouseRelease and\ event.button() == QtCore.Qt.LeftButton and\ event.scenePos().x() >= 0 and event.scenePos().x() < self._scene.width() and\ event.scenePos().y() >= 0 and event.scenePos().y() < self._scene.height(): pos = event.scenePos() box_clicked_x = self.windowToSquareX(pos.x()) box_clicked_y = self.windowToSquareYInv(pos.y()) new_origin = int(box_clicked_x + box_clicked_y * self.hor_pixels) if not self.shift_down: self.curr_origins.clear() self.curr_origins.add(new_origin) print(self.curr_origins) self.originsUpdated.emit(self.curr_origins) elif event.type() == QtCore.QEvent.GraphicsSceneMouseMove: self.onMouseHover(event.scenePos()) elif event.type() == QtCore.QEvent.KeyPress: if event.key() == QtCore.Qt.Key_Shift: self.shift_down = True elif event.type() == QtCore.QEvent.KeyRelease: if event.key() == QtCore.Qt.Key_Shift: self.shift_down = False return widgets.QWidget.eventFilter(self, source, event)
def eventFilter(self, obj, event: QtCore.QEvent) -> bool: # pylint: disable=unused-argument if event.type() == QtCore.QEvent.MouseButtonPress: if event.button() == QtCore.Qt.LeftButton: if not self._dialog._ctrl_pressed: # listView and treeView modes point to the same # abstractView so clearing any of them is ok self._dialog.listView.clearSelection() return False return False
def eventFilter(self, source, event: QEvent): if self.data is not None: if event.type() == QEvent.MouseButtonRelease: pos = event.pos() data = self.get_data_at(pos.x(), pos.y()) if data is not None: if event.button() == Qt.LeftButton: self.mouseLeftClicked.emit(data) elif event.button() == Qt.RightButton: self.mouseRightClicked.emit(data) elif event.type() == QEvent.MouseMove: pos = event.pos() data = self.get_data_at(pos.x(), pos.y()) if data is not None: self.mouseOver.emit(data) self.viewport().setCursor(Qt.PointingHandCursor) else: self.viewport().setCursor(Qt.ArrowCursor) return QWidget.eventFilter(self, source, event)
def editorEvent(self, event: QEvent, model: QAbstractItemModel, option: QStyleOptionViewItem, index: QModelIndex): if not int(index.flags() & Qt.ItemIsEditable) > 0: return False if event.type() == QEvent.MouseButtonPress and \ event.button() == Qt.LeftButton: self.setModelData(None, model, index) return True return False
def editorEvent(self, event: QEvent, model: QAbstractItemModel, option: 'QStyleOptionViewItem', index: QModelIndex) -> bool: if (event.type() == QEvent.MouseButtonPress and event.button() == Qt.LeftButton and index in option.widget.selectedIndexes()): # the index is already selected, we'll delay the (possible) # editing but we MUST store the direct reference to the table for # the lambda function, since the option object is going to be # destroyed; this is very important: if you use "option.widget" # in the lambda the program will probably hang or crash table = option.widget QTimer.singleShot(0, lambda: self.checkIndex(table, index)) return super().editorEvent(event, model, option, index)
def mousePressEvent(self, event: QtCore.QEvent): if event.type() == QtCore.QEvent.MouseButtonPress: if event.button() == QtCore.Qt.RightButton: pos = self.mapFromGlobal(QtGui.QCursor.pos()) row = self.indexAt(pos).row( ) # returns -1 if there is no item at clicked point if row >= 0: self.rightClicked.emit(row, event) else: super().mousePressEvent(event)
def eventFilter(self, object: object, event: QEvent) -> bool: """ """ # print(f"debug: QDebug[{type(self).__name__}].eventFilter: " # f"event={type(event)}, object={type(object)}, " # f"type={event.type()}") if event.type() == QEvent.MouseButtonPress: # event is of type QMouseEvent modifiers = event.modifiers() if modifiers & Qt.ControlModifier: button = event.button() print(f"debug: QDebug[{type(self).__name__}].eventFilter: " f"object={type(object).__name__}, button={button}, " f"shift={bool(modifiers & Qt.ShiftModifier)}, " f"control={bool(modifiers & Qt.ControlModifier)}" f"alt={bool(modifiers & Qt.AltModifier)}") self.debug() return False
def eventFilter(self, obj: QtCore.QObject, event: QtCore.QEvent) -> bool: if obj == self.lineEdit(): if event.type() == QtCore.QEvent.MouseButtonRelease \ and event.button() == QtCore.Qt.LeftButton: if self.closeOnLineEditClick: self.hidePopup() else: self.showPopup() return True return False elif obj == self.view().viewport(): if event.type() == QtCore.QEvent.MouseButtonRelease: index = self.view().indexAt(event.pos()) item = self.model().item(index.row()) if item.checkState() == QtCore.Qt.Checked: item.setCheckState(QtCore.Qt.Unchecked) else: item.setCheckState(QtCore.Qt.Checked) return True return False
def editorEvent( self, event: QEvent, model: QAbstractItemModel, option: QStyleOptionViewItem, index: QModelIndex, ) -> bool: if not int(index.flags() & Qt.ItemIsEditable) > 0: return False if ( event.type() == QEvent.MouseButtonRelease and event.button() == Qt.LeftButton ): self.setModelData(None, model, index) return True elif event.type() == QEvent.KeyPress: if event.key() != Qt.Key_Space and event.key() != Qt.Key_Select: return False self.setModelData(None, model, index) return True return False
def mousePressEvent(self, event: QEvent): if event.button() == QtCore.Qt.RightButton: self.rightclicked.emit() event.accept() else: return super().mousePressEvent(event)
def eventFilter(self, watched: QObject, event: QEvent): # If top-left button is right clicked, reset model's sorting order if event.type() == QEvent.MouseButtonRelease: if event.button() == Qt.RightButton: self.resetSorting() return False
def eventFilter( self, source: QWidget, ev: QEvent, ) -> None: ''' Qt global event filter: return `False` to pass through and `True` to filter event out. https://doc.qt.io/qt-5/qobject.html#eventFilter https://doc.qt.io/qtforpython/overviews/eventsandfilters.html#event-filters ''' etype = ev.type() # TODO: turn this on and see what we can filter by default (such # as mouseWheelEvent). # print(f'ev: {ev}') if etype not in self._event_types: return False # XXX: we unpack here because apparently doing it # after pop from the mem chan isn't showing the same # event object? no clue wtf is going on there, likely # something to do with Qt internals and calling the # parent handler? if etype in {QEvent.KeyPress, QEvent.KeyRelease}: msg = KeyboardMsg( event=ev, etype=etype, key=ev.key(), mods=ev.modifiers(), txt=ev.text(), ) # TODO: is there a global setting for this? if ev.isAutoRepeat() and self._filter_auto_repeats: ev.ignore() # filter out this event and stop it's processing # https://doc.qt.io/qt-5/qobject.html#installEventFilter return True # NOTE: the event object instance coming out # the other side is mutated since Qt resumes event # processing **before** running a ``trio`` guest mode # tick, thus special handling or copying must be done. elif etype in MOUSE_EVENTS: # print('f mouse event: {ev}') msg = MouseMsg( event=ev, etype=etype, button=ev.button(), ) else: msg = ev # send event-msg to async handler self._send_chan.send_nowait(msg) # **do not** filter out this event # and instead forward to the source widget # https://doc.qt.io/qt-5/qobject.html#installEventFilter return False