def editorEvent( self, event: QtCore.QEvent, model: QtCore.QAbstractItemModel, option: QStyleOptionViewItem, index: QtCore.QModelIndex, ) -> bool: """Called when an event has occured in the editor. This can be used to customize how the delegate handles mouse/key events """ if (event.type() == event.MouseButtonRelease and event.button() == Qt.RightButton): self.show_context_menu(index, model, event.globalPos(), option.widget) # if the user clicks quickly on the visibility checkbox, we *don't* # want it to be interpreted as a double-click. We want the visibilty # to simply be toggled. if event.type() == event.MouseButtonDblClick: self.initStyleOption(option, index) style = option.widget.style() check_rect = style.subElementRect( style.SE_ItemViewItemCheckIndicator, option, option.widget) if check_rect.contains(event.pos()): cur_state = index.data(Qt.CheckStateRole) if model.flags(index) & Qt.ItemIsUserTristate: state = Qt.CheckState((cur_state + 1) % 3) else: state = Qt.Unchecked if cur_state else Qt.Checked return model.setData(index, state, Qt.CheckStateRole) # refer all other events to the QStyledItemDelegate return super().editorEvent(event, model, option, index)
def event(self, event: QEvent): if event.type() == QEvent.ToolTip and self.components: # text = str(self.component) text_list = [] for el in self.components: if self.settings.component_is_chosen(el): text_list.append("☑{}".format(el)) else: text_list.append("☐{}".format(el)) QToolTip.showText(event.globalPos(), " ".join(text_list)) return super().event(event)
def event(self, event: QEvent): if event.type() == QEvent.ToolTip and self.components: text = self.get_tool_tip_text() if text: QToolTip.showText(event.globalPos(), text) return super().event(event)
def eventFilter(self, widget, event: QEvent): """Handle frameless window events. Args: widget (QObject): Widget. event (QEvent): Event. """ if (hasattr(widget, "window") and widget.window() is self): self.__updateGripRect() if (hasattr(event, "x") and self.titlebar().rect().contains( self.mapFromParent(QCursor.pos())) and self.titlebar().mouseOverTitlebar( event.x(), event.y())): # when cursor is over titlebar if event.type( ) == QMouseEvent.MouseButtonPress and event.buttons( ) == Qt.LeftButton: # if titlebar clicked with left button self.__moving = True margins = self.titlebar().contentsMargins() self.__move_offset = event.pos() + self.titlebar().pos( ) - QPoint(margins.left(), margins.top()) elif event.type() == QMouseEvent.MouseMove and event.buttons( ) == Qt.LeftButton: # if holding left button and moving window if self.__moving: if self.windowState() == Qt.WindowMaximized: self.setWindowState(Qt.WindowNoState) self.titlebar().on_btnRestore_clicked() self.move(event.pos() - self.mapFromParent(event.pos())) self.__moving = False else: self.move(event.globalPos() - self.__move_offset) elif event.type( ) == QMouseEvent.MouseButtonRelease and event.button( ) == Qt.LeftButton: # if left button released self.__moving = False screen = QApplication.instance().desktop( ).availableGeometry() if event.globalY() == 0: # snap to top edge self.titlebar().on_btnMaximize_clicked() elif event.globalX() == 0: # snap to left edge self.move(QPoint(0, 0)) self.resize(QSize(screen.width() / 2, screen.height())) self.setWindowState(Qt.WindowNoState) elif event.globalX() + 1 >= screen.width(): # snap to right edge self.move(QPoint(screen.width() / 2, 0)) self.resize(QSize(screen.width() / 2, screen.height())) self.setWindowState(Qt.WindowNoState) elif self.geometry().y() < 0: # move window if top of window is outside display self.move(QPoint(self.geometry().x(), 0)) elif event.type() == QMouseEvent.MouseButtonDblClick: # maximize/restore on double click if self.windowState() == Qt.WindowMaximized: self.setWindowState(Qt.WindowNoState) elif self.windowState() == Qt.WindowNoState: self.showMaximized() elif event.type() == QEvent.Leave and widget is self.titlebar(): # fixes __moving remain True after clicking titlebar on border and leaving titlebar self.__moving = False elif (self.windowState() not in (Qt.WindowFullScreen, Qt.WindowMaximized) and self.isResizingEnabled()): # when cursor is not over titlebar # and window is not maximized or in full screen mode # button pressed if event.type() == QMouseEvent.MouseButtonPress: if self.__griprect.contains( event.pos() ) and not self.__horizontalResizing and not self.__verticalResizing: # corner grip self.__resizing = True elif self.__hgriprect.contains(event.pos( )) and not self.__resizing and not self.__verticalResizing: # right grip self.__horizontalResizing = True elif self.__vgriprect.contains( event.pos() ) and not self.__resizing and not self.__horizontalResizing: # bottom grip self.__verticalResizing = True if event.type() == QMouseEvent.MouseButtonRelease: # stop resizing if self.__resizing or self.__horizontalResizing or self.__verticalResizing: self.__resizing = False self.__horizontalResizing = False self.__verticalResizing = False self.setCursor(Qt.ArrowCursor) if event.type() == QMouseEvent.MouseMove: # moving cursor while holding left button -> resize if self.__resizing and not self.__horizontalResizing and not self.__verticalResizing: if event.buttons() == Qt.LeftButton: self.setCursor(Qt.SizeFDiagCursor) self.resize(QSize(event.x(), event.y())) elif self.__horizontalResizing and not self.__resizing and not self.__verticalResizing: if event.buttons() == Qt.LeftButton: self.setCursor(Qt.SizeHorCursor) self.resize(QSize(event.x(), self.height())) elif self.__verticalResizing and not self.__resizing and not self.__horizontalResizing: if event.buttons() == Qt.LeftButton: self.setCursor(Qt.SizeVerCursor) self.resize(QSize(self.width(), event.y())) else: if (self.__griprect.contains(event.pos()) and not self.__horizontalResizing and not self.__verticalResizing): self.setCursor(Qt.SizeFDiagCursor) elif (self.__hgriprect.contains(event.pos()) and not self.__resizing and not self.__verticalResizing): self.setCursor(Qt.SizeHorCursor) elif (self.__vgriprect.contains(event.pos()) and not self.__resizing and not self.__horizontalResizing): self.setCursor(Qt.SizeVerCursor) else: self.setCursor(Qt.ArrowCursor) return super().eventFilter(widget, event)