def mousePressEvent( self, event ): # handle an internal move # start a drag event if event.button() == Qt.LeftButton and self.dragDropRect().contains(event.pos()): # create the pixmap pixmap = QPixmap.grabWidget(self, self.rect()) # create the mimedata mimeData = QMimeData() mimeData.setText('ItemTitle::%s' % (self.title())) # create the drag drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.setHotSpot(event.pos()) if not drag.exec_(): self._accordianWidget.emitItemDragFailed(self) event.accept() # determine if the expand/collapse should occur elif event.button() == Qt.LeftButton and self.expandCollapseRect().contains(event.pos()): self._clicked = True event.accept() else: event.ignore()
def _drag_pixmap(self, item, items): """ Internal function that shows the pixmap for the given item during drag operation :param item: LibraryItem :param items: list(LibraryItem) :return: QPixmap """ rect = self.visualRect(self.index_from_item(item)) pixmap = QPixmap() pixmap = pixmap.grabWidget(self, rect) if len(items) > 1: custom_width = 35 custom_padding = 5 custom_text = str(len(items)) custom_x = pixmap.rect().center().x() - float(custom_width * 0.5) custom_y = pixmap.rect().top() + custom_padding custom_rect = QRect(custom_x, custom_y, custom_width, custom_width) painter = QPainter(pixmap) painter.setRenderHint(QPainter.Antialiasing) painter.setPen(Qt.NoPen) painter.setBrush(self.viewer().background_selected_color()) painter.drawEllipse(custom_rect.center(), float(custom_width * 0.5), float(custom_width * 0.5)) font = QFont('Serif', 12, QFont.Light) painter.setFont(font) painter.setPen(self.viewer().text_selected_color()) painter.drawText(custom_rect, Qt.AlignCenter, str(custom_text)) return pixmap
def mousePressEvent(self, event): """ Override the behaviour when the mouse is pressed """ self._drag_initiated = False self._drag_dropped_pos = QPoint() if event.button() == Qt.LeftButton and event.modifiers( ) == Qt.ControlModifier: self._drag_start_pos = event.pos() # Get mouse position and store the area rectangle of the selected tab pos = event.pos() self._select_tab_index = self.tabAt(pos) rect = self.tabRect(self._select_tab_index) # Store a pixmap of the selected tab and a pixmap of the close hand cursor image # After that we draw the tab and also the hand cursor in the middle of the tab pixmap = QPixmap.grabWidget(self, rect) painter = QPainter(pixmap) cursor_pm = QPixmap(':/icons/close_hand_cursor.png') cursor_pos = QPoint(*map(lambda x, y: (x - y) * 0.5, rect.size().toTuple(), cursor_pm.size().toTuple())) painter.drawPixmap(cursor_pos, cursor_pm) painter.end() # Update cursor cursor = QCursor(pixmap) self.setCursor(cursor) super(TearOffTabBar, self).mousePressEvent(event)
def mouseMoveEvent(self, event): """ Override the behaviour when the mouse is moved Doing this we avoid that the tab is moved when tearing off the tab """ if self._select_tab_index < -1: pass else: if event.modifiers() == Qt.ControlModifier: self.setCursor(Qt.OpenHandCursor) else: self.setCursor(Qt.ArrowCursor) if not event.buttons() == Qt.LeftButton: return if not self._drag_start_pos.isNull() and ( event.pos() - self._drag_start_pos ).manhattanLength() < QApplication.startDragDistance(): self._drag_initiated = True if (event.buttons() == Qt.LeftButton ) and self._drag_initiated and not self.geometry().contains( event.pos()): finish_move_event = QMouseEvent(QEvent.MouseMove, event.pos(), Qt.NoButton, Qt.NoButton, Qt.NoModifier) super(TearOffTabBar, self).mouseMoveEvent(finish_move_event) drag = QDrag(self) mime_data = QMimeData() mime_data.setData('action', 'application/tab-detach') drag.setMimeData(mime_data) rect = self.tabRect(self.tabAt(event.pos())) pixmap_big = QPixmap.grabWidget( self.parentWidget().currentWidget()).scaled( 640, 480, Qt.KeepAspectRatio) drag.setPixmap(pixmap_big) drag.setDragCursor(QPixmap(), Qt.LinkAction) dragged = drag.exec_(Qt.MoveAction) if dragged == Qt.IgnoreAction: # moved outside of tab widget event.accept() self.tabDetached.emit(self.tabAt(self._drag_start_pos), QCursor.pos()) elif dragged == Qt.MoveAction: # moved inside of tab widget if not self._drag_dropped_pos.isNull(): event.accept() self.tabMoved.emit(self.tabAt(self._drag_start_pos), self.tabAt(self._drag_dropped_pos)) self._drag_dropped_pos = QPoint() else: super(TearOffTabBar, self).mouseMoveEvent(event)
def mousePressEvent(self, event): if self.dragDropMode() and event.button() == Qt.LeftButton and self.dragDropRect().contains(event.pos()): pixmap = QPixmap.grabWidget(self, self.rect()) mimeData = QMimeData() mimeData.setText('ItemTitle::%s' % self.title()) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.setHotSpot(event.pos()) if not drag.exec_(): self._expanderWidget.emitItemDragFailed(self) event.accept() elif event.button() == Qt.LeftButton and self.expandCollapseRect().contains(event.pos()): self._clicked = True event.accept() else: event.ignore()
def mousePressEvent(self, event): if event.button() == Qt.LeftButton and self.get_drag_drop_rect().contains(event.pos()): pixmap = QPixmap.grabWidget(self, self.rect()) mime_data = QMimeData() mime_data.setText('ItemTitle::{}'.format(self.title())) drag = QDrag(self) drag.setMimeData(mime_data) drag.setPixmap(pixmap) drag.setHotSpot(event.pos()) if not drag.exec_(): self._accordion_widget.emit_item_drag_failed(self) event.accept() # Check if the expand/collapse should happen elif event.button() == Qt.LeftButton and self.expand_collapse_rect().contains(event.pos()): self._clicked = True event.accept() else: event.ignore()