Пример #1
0
 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)
Пример #2
0
    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)
Пример #3
0
    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
Пример #4
0
    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)
Пример #5
0
 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
Пример #6
0
    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)
Пример #7
0
    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
Пример #8
0
 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)
Пример #9
0
    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)
Пример #10
0
 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
Пример #11
0
    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
Пример #12
0
    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
Пример #13
0
 def mousePressEvent(self, event: QEvent):
     if event.button() == QtCore.Qt.RightButton:
         self.rightclicked.emit()
         event.accept()
     else:
         return super().mousePressEvent(event)
Пример #14
0
 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
Пример #15
0
    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