def __onDragStarted(self, index): desc = qunwrap(index.data(QtWidgetRegistry.WIDGET_DESC_ROLE)) icon = qunwrap(index.data(Qt.DecorationRole)) drag_data = QMimeData() drag_data.setData( "application/vnv.orange-canvas.registry.qualified-name", desc.qualified_name) drag = QDrag(self) drag.setPixmap(icon.pixmap(38)) drag.setMimeData(drag_data) # TODO: Should animate (accept) hide. self.hide() # When a drag is started and the menu hidden the item's tool tip # can still show for a short time UNDER the cursor preventing a # drop. viewport = self.__menu.view().viewport() filter = ToolTipEventFilter() viewport.installEventFilter(filter) drag.exec_(Qt.CopyAction) viewport.removeEventFilter(filter)
def mousePressEvent(self, event): if event.buttons() != Qt.LeftButton: return icon = QLabel() mimeData = QMimeData() mime_text = str(self.row) + str(self.column) + str( self.__class__.__name__) mimeData.setText(mime_text) pixmap = QPixmap('images/ExecOp.png').scaled(120, 60) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(self.pixmap) drag.setHotSpot(event.pos() - self.rect().topLeft()) if drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) == Qt.MoveAction: icon.close() else: icon.show() icon.setPixmap(self.pixmap)
def mouseMoveEvent(self, event): # перетягивание на левую кнопку мыши + установка минимальной длины для начала перетягивания (4 пикселя) if not (event.buttons() & Qt.LeftButton): return if (event.pos() - self.drag_start_position).manhattanLength() < 2: global correction correction = event.pos() - self.drag_start_position drag = QDrag(self) # QMimeData() - класс для хранения данных любого типа во время перетягивания mimedata = QMimeData() mimedata.setImageData(self.pixmap().toImage()) # изображение в качестве данных, которое потом можно будет дропнуть drag.setMimeData(mimedata) t = QTransform().rotate(ui.angle) pixmap = QPixmap(ui.image_raw_main.transformed(t)) #Все исправление в 3 строчки pixmap = pixmap.scaled(self.size()) painter = QPainter(pixmap) self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) self.setStyleSheet("background:transparent;") painter.drawPixmap(self.rect(), self.grab()) painter.end() drag.setPixmap(pixmap) #именно здесь происходит прорисовка изображения, работает и без QPainter, но #Но он помогает восстановить качество картинки, по сути перерисовывая новую картинку поверх старой, #повреждено из за метода scaled. Картинка из этой строчки по сути является фоном, и именно в ней и была проблема drag.setHotSpot(event.pos() - self.rect().topLeft()) drag.exec_(Qt.CopyAction | Qt.MoveAction)
def mouseMoveEvent(self, event): if not (event.buttons() & Qt.LeftButton): return if (event.pos() - self.drag_start_position).manhattanLength() < 2: global correction correction = event.pos() - self.drag_start_position drag = QDrag(self) mimedata = QMimeData() mimedata.setImageData(self.pixmap().toImage()) # изображение в качестве данных, которое потом можно будет дропнуть drag.setMimeData(mimedata) #t = QTransform().rotate(ui.angle) pixmap = QPixmap(drag.mimeData().imageData()) # POGU pixmap = pixmap.scaled(self.size()) painter = QPainter(pixmap) self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.setAttribute(QtCore.Qt.WA_TranslucentBackground) self.setStyleSheet("background:transparent;") painter.drawPixmap(self.rect(), self.grab()) painter.end() drag.setPixmap(pixmap) drag.setHotSpot(event.pos() - self.rect().topLeft()) drag.exec_(Qt.CopyAction | Qt.MoveAction)
class Button(QPushButton): def __init__(self, title, parent): super().__init__(title, parent) def mouseMoveEvent(self, e): if e.buttons() != Qt.LeftButton: return mimeData = QMimeData() mimeData.setText(self.text()) self.drag = QDrag(self) self.drag.setMimeData(mimeData) self.drag.setPixmap(self.grab()) self.drag.setHotSpot(self.rect().center()) dropAction = self.drag.exec_(Qt.MoveAction) def mousePressEvent(self, e): super().mousePressEvent(e) if e.button() == Qt.RightButton: text, result = QInputDialog.getText(self, 'Input Dialog', 'Upiši zadatak:') if(result == True): self.setText(text)
def mousePressEvent(self, event): child = self.childAt(event.pos()) if not child: return pixmap = QPixmap(child.pixmap()) itemData = QByteArray() dataStream = QDataStream(itemData, QIODevice.WriteOnly) dataStream << pixmap << QPoint(event.pos() - child.pos()) mimeData = QMimeData() mimeData.setData('application/x-dnditemdata', itemData) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.setHotSpot(event.pos() - child.pos()) tempPixmap = QPixmap(pixmap) painter = QPainter() painter.begin(tempPixmap) painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127)) painter.end() child.setPixmap(tempPixmap) if drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) == Qt.MoveAction: child.close() else: child.show() child.setPixmap(pixmap)
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 startDrag(self, event): """ Override startDrag method to display custom icon """ # Get image of selected item selected = self.selectedIndexes() # Start drag operation drag = QDrag(self) drag.setMimeData(self.model.mimeData(selected)) icon = self.model.data(selected[0], Qt.DecorationRole) drag.setPixmap( icon.pixmap(QSize(self.drag_item_size, self.drag_item_size))) drag.setHotSpot( QPoint(self.drag_item_size / 2, self.drag_item_size / 2)) # Create emoji file before drag starts data = json.loads(drag.mimeData().text()) file = self.add_file(data[0]) # Update mimedata for emoji data = QMimeData() data.setText(json.dumps([file.id])) data.setHtml("clip") drag.setMimeData(data) # Start drag drag.exec_()
def _start_drag_files(self, action): drag = QDrag(self) drag.setPixmap(QPixmap(":/image/List.png")) indexes = self.ui.filesList.selectionModel().selectedRows() mime_data = self.ui.filesList.model().mimeData(indexes) drag.setMimeData(mime_data) drag.exec_(Qt.CopyAction)
def mouseMoveEvent(self, event): if not (event.buttons() & Qt.Qt.LeftButton): return if (event.pos() - self.drag_start_position ).manhattanLength() < QApplication.startDragDistance(): return drag = QDrag(self) mimedata = QMimeData() row = self.indexAt(self.drag_start_position).row() collumn = self.indexAt(self.drag_start_position).column() mimedata.setText(self.item(row, collumn).text()) drag.setMimeData(mimedata) item = QLabel(self.item(row, collumn).text()) item.adjustSize() # item.setFixedSize(100,50) pixmap = QtWidgets.QWidget.grab(item) # pixmap = QPixmap(self.size()) painter = QPainter(pixmap) painter.drawPixmap(item.rect(), item.grab()) painter.end() drag.setPixmap(pixmap) # drag.setHotSpot(event.pos()) drag.setPixmap(pixmap) # shift the Pixmap so that it coincides with the cursor position # drag.setHotSpot(event.pos()) drag.exec_(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction)
def mousePressEvent(self, event): child = self.childAt(event.pos()) if child is None: return hotSpot = event.pos() - child.pos() itemData = QByteArray() dataStream = QDataStream(itemData, QIODevice.WriteOnly) dataStream.writeQString(child.labelText()) dataStream << hotSpot mimeData = QMimeData() mimeData.setData(fridgeMagnetsMimeType(), itemData) mimeData.setText(child.labelText()) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(child.pixmap()) drag.setHotSpot(hotSpot) child.hide() if drag.exec(Qt.MoveAction | Qt.CopyAction, Qt.CopyAction) == Qt.MoveAction: child.close() else: child.show()
def drag(self, parent, mimeData): """Called by dragFile and dragData. Execs a QDrag on the mime data.""" d = QDrag(parent) d.setMimeData(mimeData) d.setPixmap(self.pixmap()) d.setHotSpot(QPoint(-10, -10)) return d.exec_(Qt.CopyAction)
def startDrag(self, event): """ Override startDrag method to display custom icon """ # Get first column indexes for all selected rows selected = self.selectionModel().selectedRows(0) # Get image of current item current = self.selectionModel().currentIndex() if not current.isValid() and selected: current = selected[0] if not current.isValid(): # We can't find anything to drag log.warning("No draggable items found in model!") return False # Get icon from column 0 on same row as current item icon = current.sibling(current.row(), 0).data(Qt.DecorationRole) # Start drag operation drag = QDrag(self) drag.setMimeData(self.model().mimeData(selected)) drag.setPixmap(icon.pixmap(QSize(self.drag_item_size, self.drag_item_size))) drag.setHotSpot(QPoint(self.drag_item_size / 2, self.drag_item_size / 2)) drag.exec_()
def __prepareDropData(self, event): """prepares data for the drag and drop process""" drag = QDrag(self) dropData = QMimeData() data = { 'id': self.tileLayout.id, 'from_row': self.fromRow, 'from_column': self.fromColumn, 'row_span': self.rowSpan, 'column_span': self.columnSpan, 'row_offset': event.pos().y() // (self.verticalSpan + self.tileLayout.verticalSpacing()), 'column_offset': event.pos().x() // (self.horizontalSpan + self.tileLayout.horizontalSpacing()), } dataToText = json.dumps(data) dropData.setData('TileData', QByteArray(dataToText.encode())) dragIcon = self.widget.grab() drag.setPixmap(dragIcon) drag.setMimeData(dropData) drag.setHotSpot(event.pos() - self.rect().topLeft()) return drag
def mouseMoveEvent(self, ev): if (ev.pos() - self.press_pos).manhattanLength() > 16: # print("drag start") drag = QDrag(self.controller._gui._window) # Create the drag thumbnail if False: pix = QPixmap(self.tile_rect.width(), self.tile_rect.height()) painter = QPainter(pix) self.paint(painter, None, None) painter.end() drag.setPixmap(pix) drag.setHotSpot(ev.pos().toPoint() - self.tile_rect.topLeft()) else: pix = QPixmap("/usr/share/icons/mate/32x32/actions/gtk-dnd-multiple.png").scaled(48, 48) drag.setPixmap(pix) if not self.isSelected(): self.controller.clear_selection() self.setSelected(True) mime_data = self.controller.selection_to_mimedata(uri_only=True) drag.setMimeData(mime_data) # Qt does not allow custom drag actions officially. The # default drag action value is however carried through # even if it's invalid, but cursor changes and signals # like actionChanged() misbehave. The DragWidget class is # a workaround. drag_widget = DragWidget(None) # noqa: F841 # this will eat up the mouseReleaseEvent drag.exec(Qt.CopyAction | Qt.MoveAction | Qt.LinkAction | 0x40, 0x40)
def mouseMoveEvent(self, e: QtGui.QMouseEvent) -> None: if e.buttons() != Qt.LeftButton: return None #根据currentIndex获取数据行的名称 mimeData = QMimeData() mimeData.setText('{}:{}:{}'.format(self.type, self.address, self.text())) #绘制拖动时的图像 pixmap = QPixmap(self.size()) paint = QPainter() paint.begin(pixmap) # paint.fillRect(pixmap.rect(),QColor(Qt.white)) # paint.drawRect(pixmap.rect()) paint.drawPixmap(self.rect(), self.grab()) paint.drawText(pixmap.rect(), Qt.AlignCenter, self.text()) paint.end() #设定拖动项的数据和图标 drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.exec_(Qt.MoveAction) super().mouseMoveEvent(e)
def mousePressEvent(self, event): child = self.childAt(event.pos()) if not child: return pixmap = QPixmap(child.pixmap()) mimeData = QMimeData() mimeData.setText(child.type) drag = QDrag(self) drag.setPixmap(child.pixmap()) drag.setMimeData(mimeData) drag.setHotSpot(event.pos() - child.pos()) tempPixmap = QPixmap(pixmap) painter = QPainter() painter.begin(tempPixmap) painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127)) painter.end() child.setPixmap(tempPixmap) if drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) == Qt.MoveAction: child.close() else: child.show() child.setPixmap(pixmap)
def mousePressEvent(self, event): logging.debug('DropBox::mousePressEvent() called: {}'.format( event.pos())) try: mimeData = QMimeData() mimeData.setText(self.type) # load config into memory tmp_config of storabar self.parent.tmp_config = self.config self.parent.tmp_element = self # push config to active workingarea self.parent.loadConfig() except Exception as e: logging.error( 'DropBox::mousePressEvent() Exception caught: {}'.format( str(e))) return drag = QDrag(self) drag.setHotSpot(event.pos()) drag.setPixmap(self.label.pixmap()) drag.setMimeData(mimeData) if drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) == Qt.MoveAction: self.close() else: self.show() self.label.setPixmap(self.label.pixmap()) logging.debug('DropBox::mousePressEvent() dropped')
def mouseMoveEvent(self, e: QtGui.QMouseEvent) -> None: if e.buttons() != Qt.LeftButton: return None #根据currentIndex获取数据行的名称 mimeData = QMimeData() currentRow = self.currentIndex().row() index = self.model().index(currentRow, 0) itemName = self.model().data(index) mimeData.setText('{}:{}:{}'.format(self.type, self.address, itemName)) #绘制拖动时的图像 width = self.columnWidth(0) height = self.rowHeight(currentRow) pixmap = QPixmap(width, height) paint = QPainter() paint.begin(pixmap) paint.fillRect(pixmap.rect(), QColor(Qt.white)) paint.drawRect(0, 0, width - 1, height - 1) paint.drawText(pixmap.rect(), Qt.AlignCenter, itemName) paint.end() #设定拖动项的数据和图标 drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.exec_(Qt.MoveAction) super().mouseMoveEvent(e)
def mouseMoveEvent(self, event): if QLineF(QPointF(event.screenPos()), QPointF(event.buttonDownScreenPos(Qt.LeftButton))).length() < QApplication.startDragDistance(): return drag = QDrag(event.widget()) mime = QMimeData() drag.setMimeData(mime) ColorItem.n += 1 if ColorItem.n > 2 and qrand() % 3 == 0: image = QImage(':/images/head.png') mime.setImageData(image) drag.setPixmap(QPixmap.fromImage(image).scaled(30,40)) drag.setHotSpot(QPoint(15, 30)) else: mime.setColorData(self.color) mime.setText("#%02x%02x%02x" % (self.color.red(), self.color.green(), self.color.blue())) pixmap = QPixmap(34, 34) pixmap.fill(Qt.white) painter = QPainter(pixmap) painter.translate(15, 15) painter.setRenderHint(QPainter.Antialiasing) self.paint(painter, None, None) painter.end() pixmap.setMask(pixmap.createHeuristicMask()) drag.setPixmap(pixmap) drag.setHotSpot(QPoint(15, 20)) drag.exec_() self.setCursor(Qt.OpenHandCursor)
def mousePressEvent(self, event): logging.debug('ElementMaster::mousePressEvent() called') # uncomment this for debugging purpose #self.listChild() if event.buttons() != Qt.LeftButton: return icon = QLabel() mimeData = QMimeData() mime_text = str(self.row) + str(self.column) + str(self.__class__.__name__) mimeData.setText(mime_text) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(self.pixmap) drag.setHotSpot(event.pos() - self.rect().topLeft()) if drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) == Qt.MoveAction: icon.close() else: icon.show() icon.setPixmap(self.pixmap)
def mouseMoveEvent(self, event): if self.dialog.removable: return if not (event.buttons() & Qt.LeftButton): return if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance(): return drag = QDrag(self) mimedata = QMimeData() mimedata.setText(self.text()) if self.pixmap() is None: return mimedata.setImageData(self.pixmap().toImage()) drag.setMimeData(mimedata) pixmap = QPixmap(self.size()) self.image = pixmap painter = QPainter(pixmap) painter.drawPixmap(self.rect(), self.grab()) painter.end() drag.setPixmap(pixmap) drag.setHotSpot(event.pos()) print("Moving") drag.exec_(Qt.MoveAction)
def mouseMoveEvent(self, event): """ If the mouse moves far enough when the left mouse button is held down, start a drag and drop operation. """ if not event.buttons() & Qt.LeftButton: return if (event.pos() - self.dragStartPosition).manhattanLength() \ < QApplication.startDragDistance(): return if not self.hasImage: return drag = QDrag(self) mimeData = QMimeData() output = QByteArray() outputBuffer = QBuffer(output) outputBuffer.open(QIODevice.WriteOnly) self.imageLabel.pixmap().toImage().save(outputBuffer, 'PNG') outputBuffer.close() mimeData.setData('image/png', output) drag.setMimeData(mimeData) drag.setPixmap(self.imageLabel.pixmap().scaled(64, 64, Qt.KeepAspectRatio)) drag.setHotSpot(QPoint(drag.pixmap().width() / 2, drag.pixmap().height())) drag.start()
def mouseMoveEvent(self, a0: QMouseEvent) -> None: if (a0.buttons() == Qt.LeftButton) and abs(a0.pos().y()) > 30: globalPos = self.mapToGlobal(a0.pos()) posInTab = self.mapFromGlobal(globalPos) TabBar.indexTabToDrag = self.currentIndex() tabRect = self.tabRect(self.indexTabToDrag) pixmap = QPixmap(tabRect.size()) self.render(pixmap, QPoint(), QRegion(tabRect)) mimeData = QMimeData() drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) cursor = QCursor(Qt.OpenHandCursor) drag.setHotSpot(cursor.pos()) drag.setHotSpot(a0.pos() - posInTab) drag.setDragCursor(cursor.pixmap(), Qt.MoveAction) dropAction = drag.exec(Qt.MoveAction) # If the drag completed outside of the tab bar, detach the tab and move # the content to the current cursor position if dropAction == Qt.IgnoreAction: a0.accept() self.detachTab(self.indexTabToDrag, self.cursor().pos()) else: super(TabBar, self).mouseMoveEvent(a0)
def mouseMoveEvent(self, event): if self.tab_rect: self.tab_rect.moveTopLeft(event.pos()) if event.buttons( ) == Qt.LeftButton and self.pressEvent and not self.bar_rect.contains( self.tab_rect): event.accept() index = self.currentIndex() mimeData = QMimeData() drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(self.pixmap) drag.setHotSpot(self.tab_rect.topLeft() - event.pos()) DetachableTabWidget.drag_widget = self.parent.widget(index) DetachableTabWidget.drag_text = self.tabText(index) self.parent.removeTab(index) dropAction = drag.exec_(Qt.MoveAction | Qt.TargetMoveAction | Qt.IgnoreAction) self.parent.dragLeaveEvent(event) if dropAction == 0: self.parent.insertTab(index, DetachableTabWidget.drag_widget, DetachableTabWidget.drag_text) self.parent.setCurrentIndex(index) else: QTabBar.mouseMoveEvent(self, event)
def mouseMoveEvent(self, event): if not (event.buttons() & Qt.LeftButton): return None manhattanLength = event.pos() manhattanLength -= self.drag_start_position manhattanLength = manhattanLength.manhattanLength() if manhattanLength < QApplication.startDragDistance(): return None drag = QDrag(self) mimedata = QMimeData() message = json.dumps({ "codigo": self.code, "estado": self.state, "semestre actual": self.semester }) mimedata.setText(message) drag.setMimeData(mimedata) pixmap = QPixmap(QSize(subject_width, self.height)) painter = QPainter(pixmap) painter.drawPixmap(0, 0, subject_width, self.height, self.grab()) painter.end() pixmap = pixmap.scaled(QSize(subject_width, self.height)) drag.setPixmap(pixmap) drag.setHotSpot(event.pos()) drag.exec_(Qt.CopyAction | Qt.MoveAction)
def mousePressEvent(self, event): from widgets.columneditor import ColumnEditor from widgets.sectioneditor import SectionEditor if self.mode != Mode.ENABLED or event.button() != Qt.LeftButton: return if self.parentWidget().layout.count() == 1: self.elementDragged.emit() mimeData = WidgetMimeData() mimeData.setData(self) parent = self.parentWidget() if isinstance(parent, ColumnEditor): mimeData.source_list = parent.column._items elif isinstance(parent, SectionEditor): mimeData.source_list = parent.section._items pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos()) drag.setPixmap(pixmap) self.hide() if drag.exec(Qt.MoveAction) == Qt.IgnoreAction: self.show()
def mousePressEvent(self, event): from widgets.sectioneditor import SectionEditor mimeData = WidgetMimeData() mimeData.setSize(self.size().width(), self.size().height()) mimeData.setData(self) parent = self.parentWidget() if isinstance(parent, SectionEditor): mimeData.source_list = parent.section._items pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos()) drag.setPixmap(pixmap) se = self.parentWidget() se.removeRowEditor(self) pe = se.parentWidget() pe.enableColumnAcceptDrop(False) self.hide() if drag.exec(Qt.MoveAction) == Qt.IgnoreAction: se.addRowEditor(self) self.show() pe.enableColumnAcceptDrop(True)
def mousePressEvent(self, event): mimeData = WidgetMimeData() mimeData.setSize(self.size().width(), self.size().height()) mimeData.setData(self) pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos()) drag.setPixmap(pixmap) pe = self.parentWidget() pe.removeSectionEditor(self) pe.enableColumnAcceptDrop(False) pe.enableSectionAcceptDrop(False) self.hide() if drag.exec(Qt.MoveAction) == Qt.IgnoreAction: pe.addSection(self) self.show() pe.enableColumnAcceptDrop(True) pe.enableSectionAcceptDrop(True)
def startDrag(self, DropActions): """ 开始拖 """ item = self.currentItem() # 表示一个小拼图 itemData = QByteArray() # QByteArray类提供了一个字节数组 dataStream = QDataStream(itemData, QIODevice.WriteOnly) # QDataStream类提供二进制数据到QIODevice的序列化 piecePix = item.data(Qt.UserRole) pieceLocation = item.data(Qt.UserRole+1) # 返回给定角色的项目数据,这里分别是拼图本身和拼图的位置。 # 这里的Qt.UserRole是特定于应用程序目的的角色。 dataStream << piecePix << pieceLocation # 将拼图数据和拼图位置信息存入数据流中,注意:这里的操作符<< mimeData = QMimeData() mimeData.setData("image/x-puzzle-xdbcb8", itemData) # 构造一个没有数据的新MIME数据对象 drag = QDrag(self) drag.setMimeData(mimeData) # QDrag类支持基于MIME的拖放数据传输 drag.setHotSpot(QPoint(piecePix.width()/2, piecePix.height()/2)) # 光标的热点指向其底边的中心 drag.setPixmap(piecePix) # 拖得时候显示的图片 if drag.exec(Qt.MoveAction) == Qt.MoveAction: moveItem = self.takeItem(self.row(item)) del moveItem
def startDrag(self): self.mimeData = MimeData() self.mimeData.dataRequested.connect(self.createData, Qt.DirectConnection) drag = QDrag(self) drag.setMimeData(self.mimeData) drag.setPixmap(QPixmap(':/images/drag.png')) drag.exec_(Qt.CopyAction)
def mouseMoveEvent(self, e): """ Handles the snippet capture and drag drop initialization based off of: http://stackoverflow.com/questions/28258050/drag-n-drop-button-and-drop-down-menu-pyqt-qt-designer Parameters ---------- e : qt event Returns ------- None """ if e.buttons() != Qt.LeftButton: if hasattr(self, 'drag_start_pos'): delattr(self, 'drag_start_pos') if not hasattr(self, 'drag_start_pos'): return if not (e.pos() - self.drag_start_pos).manhattanLength() > 75: return modifiers = QApplication.keyboardModifiers() if not modifiers == Qt.ControlModifier: return mime_data = self.get_mime() # let's make it fancy. we'll show a "ghost" of the button as we drag # grab the button to a pixmap pixmap = self.grab() size = pixmap.size() * .65 half_pixmap = pixmap.scaled(size, Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation) # below makes the pixmap half transparent painter = QPainter(half_pixmap) painter.setCompositionMode(painter.CompositionMode_DestinationAtop) painter.fillRect(half_pixmap.rect(), QColor(0, 0, 0, 127)) font = QFont() font.setFamily('Arial') font.setPointSize(15) font.setBold(True) painter.setFont(font) painter.setPen(Qt.red) painter.drawText(half_pixmap.rect(), Qt.AlignCenter, self.drag_label) painter.end() drag = QDrag(self) drag.setMimeData(mime_data) drag.setPixmap(half_pixmap) drag.setHotSpot(e.pos()) # dropAction = drag.exec_(Qt.CopyAction | Qt.MoveAction) # dropAction = drag.exec_(Qt.TargetMoveAction) dropAction = drag.exec_() e.ignore()
def dragFile(widget, filename, icon=None, dropactions=Qt.CopyAction): """Starts dragging the given local file from the widget.""" if icon is None or icon.isNull(): icon = QFileIconProvider().icon(QFileInfo(filename)) drag = QDrag(widget) data = QMimeData() data.setUrls([QUrl.fromLocalFile(filename)]) drag.setMimeData(data) drag.setPixmap(icon.pixmap(32)) drag.exec_(dropactions)
def newComponentButtonMousePress(self, componentType, event): self.tool = Tool.NewComponent self.mouseState = MouseState.Dragging self.newComponentType = componentType newComponentDrag = QDrag(self.view) newComponentDrag.setHotSpot(QPoint(self.view.ui.circuitDiagram.blockSideLength / 2, self.view.ui.circuitDiagram.blockSideLength / 2)) newComponentDrag.setMimeData(QMimeData()) newComponentDrag.setPixmap(QPixmap(self.view.ui.circuitDiagram.componentTypeToImageName(componentType)).scaled(self.view.ui.circuitDiagram.blockSideLength, self.view.ui.circuitDiagram.blockSideLength)) newComponentDrag.exec_(Qt.MoveAction)
def __dragSnapshot(self): """ Private slot handling the dragging of the preview picture. """ drag = QDrag(self) mimeData = QMimeData() mimeData.setImageData(self.__snapshot) drag.setMimeData(mimeData) drag.setPixmap(self.preview.pixmap()) drag.exec_(Qt.CopyAction)
def mouseMoveEvent(self, event): # if the left mouse button is used if self.drag_started: data = QByteArray() mime_data = QMimeData() mime_data.setData(self.mimetext, data) drag = QDrag(self) drag.setMimeData(mime_data) drag.setPixmap(self.icon.get_icon()) drag.setHotSpot(self.rect().topLeft()) # where do we drag from if drag.exec_(Qt.MoveAction): self.parent().icons.remove(self) self.deleteLater()
def mousePressEvent(self, event): if event.button() == Qt.LeftButton: self.drag_started.emit(self.mapToParent(event.pos())) drag = QDrag(self) mimeData = QMimeData() mimeData.setText("Move Signal") pixmap = QPixmap(self.rect().size()) self.render(pixmap, QPoint(), QRegion(self.rect())) drag.setPixmap(pixmap) drag.setMimeData(mimeData) drag.exec_()
def mouseMoveEvent(self, evt): """ Protected method to handle mouse move events. @param evt reference to the event (QMouseEvent) """ if self.__model is None: super(E5ModelMenu, self).mouseMoveEvent(evt) return if not (evt.buttons() & Qt.LeftButton): super(E5ModelMenu, self).mouseMoveEvent(evt) return manhattanLength = (evt.pos() - self.__dragStartPosition).manhattanLength() if manhattanLength <= QApplication.startDragDistance(): super(E5ModelMenu, self).mouseMoveEvent(evt) return act = self.actionAt(self.__dragStartPosition) if act is None: super(E5ModelMenu, self).mouseMoveEvent(evt) return idx = self.index(act) if not idx.isValid(): super(E5ModelMenu, self).mouseMoveEvent(evt) return drag = QDrag(self) drag.setMimeData(self.__model.mimeData([idx])) actionRect = self.actionGeometry(act) if qVersion() >= "5.0.0": drag.setPixmap(self.grab(actionRect)) else: drag.setPixmap(QPixmap.grabWidget(self, actionRect)) if drag.exec_() == Qt.MoveAction: row = idx.row() if self.__dropIndex == idx.parent() and self.__dropRow <= row: row += 1 self.__model.removeRow(row, self.__root) if not self.isAncestorOf(drag.target()): self.close() else: self.aboutToShow.emit()
def startDrag(self, mainwin, ev): d = mainwin.currentDocument() if not d: return url = d.url() if url.isEmpty(): return drag = QDrag(mainwin) data = QMimeData() data.setUrls([url]) drag.setMimeData(data) pixmap = mainwin.style().standardPixmap(QStyle.SP_FileIcon, 0, mainwin) hotspot = QPoint(pixmap.width() - 5, 5) drag.setPixmap(pixmap) drag.setHotSpot(hotspot) drag.start(Qt.LinkAction | Qt.CopyAction)
def startDrag(self): image = self.image() data = QMimeData() data.setImageData(image) drag = QDrag(self) drag.setMimeData(data) if max(image.width(), image.height()) > 256: image = image.scaled(QSize(256, 256), Qt.KeepAspectRatio, Qt.SmoothTransformation) p = QPainter() p.begin(image) p.setCompositionMode(QPainter.CompositionMode_DestinationIn) p.fillRect(image.rect(), QColor(0, 0, 0, 160)) p.end() pixmap = QPixmap.fromImage(image) drag.setPixmap(pixmap) drag.setHotSpot(pixmap.rect().center()) drag.exec_(Qt.CopyAction)
def mouseMoveEvent(self, event): if (event.buttons() == Qt.LeftButton and (event.modifiers() == Qt.ControlModifier or event.modifiers() == Qt.ShiftModifier)): mime_data = QMimeData() mime_data.setText(PageWidget.DRAG_MAGIC) drag = QDrag(self) drag.setMimeData(mime_data) drag.setPixmap(self.grab(self.rect())) if event.modifiers() == Qt.ControlModifier: drag.exec_(Qt.MoveAction) else: drag.exec_(Qt.CopyAction) event.accept() else: event.ignore()
def mouseMoveEvent(self, e): if e.buttons() != Qt.RightButton: return globalPos = self.mapToGlobal(e.pos()) tabBar = self.tabBar() posInTab = tabBar.mapFromGlobal(globalPos) self.indexTab = tabBar.tabAt(e.pos()) tabRect = tabBar.tabRect(self.indexTab) pixmap = QPixmap(tabRect.size()) tabBar.render(pixmap, QPoint(), QRegion(tabRect)) mimeData = QMimeData() drag = QDrag(tabBar) drag.setMimeData(mimeData) drag.setPixmap(pixmap) cursor = QCursor(Qt.OpenHandCursor) drag.setHotSpot(e.pos() - posInTab) drag.setDragCursor(cursor.pixmap(), Qt.MoveAction) drag.exec_(Qt.MoveAction)
def mousePressEvent(self, event): itemData = QByteArray() dataStream = QDataStream(itemData, QIODevice.WriteOnly) dataStream << QByteArray(self.labelText) << QPoint(event.pos() - self.rect().topLeft()) mimeData = QMimeData() mimeData.setData("application/x-fridgemagnet", itemData) mimeData.setText(self.labelText) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos() - self.rect().topLeft()) drag.setPixmap(self.pixmap()) self.hide() if drag.exec_(Qt.MoveAction | Qt.CopyAction, Qt.CopyAction) == Qt.MoveAction: self.close() else: self.show()
def startDrag(self, supportedActions): item = self.currentItem() itemData = QByteArray() dataStream = QDataStream(itemData, QIODevice.WriteOnly) pixmap = QPixmap(item.data(Qt.UserRole)) location = item.data(Qt.UserRole+1) dataStream << pixmap << location mimeData = QMimeData() mimeData.setData('image/x-puzzle-piece', itemData) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(QPoint(pixmap.width()/2, pixmap.height()/2)) drag.setPixmap(pixmap) if drag.exec_(Qt.MoveAction) == Qt.MoveAction: if self.currentItem() is not None: self.takeItem(self.row(item))
def mousePressEvent(self, event): hotSpot = event.pos() mimeData = QMimeData() mimeData.setText(self.text()) mimeData.setData('application/x-hotspot', '%d %d' % (hotSpot.x(), hotSpot.y())) pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.setHotSpot(hotSpot) dropAction = drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) if dropAction == Qt.MoveAction: self.close() self.update()
def mouseMoveEvent(self, event): if self.parent() is not self.parent().src_dragwidget: for item in self.parent().src_selected: item.icon.deselect_icon() self.parent().clear_dnd() # if self.drag_started: data = QByteArray() mime_data = QMimeData() mime_data.setData(self.mimetext, data) drag = QDrag(self) drag.setMimeData(mime_data) drag.setPixmap(self.icon.get_icon()) drag.setHotSpot(self.rect().topLeft()) if drag.exec_(Qt.MoveAction): if len(self.parent().src_selected) > 0: for item in self.parent().src_selected: self.parent().icons.remove(item) item.deleteLater() else: self.parent().icons.remove(self) self.deleteLater() self.parent().clear_dnd()
def mousePressEvent(self, event): square = self.targetSquare(event.pos()) found = self.findPiece(square) if found == -1: return location = self.pieceLocations[found] pixmap = self.piecePixmaps[found] del self.pieceLocations[found] del self.piecePixmaps[found] del self.pieceRects[found] if location == QPoint(square.x() / 80, square.y() / 80): self.inPlace -= 1 self.update(square) itemData = QByteArray() dataStream = QDataStream(itemData, QIODevice.WriteOnly) dataStream << pixmap << location mimeData = QMimeData() mimeData.setData('image/x-puzzle-piece', itemData) drag = QDrag(self) drag.setMimeData(mimeData) drag.setHotSpot(event.pos() - square.topLeft()) drag.setPixmap(pixmap) if drag.exec_(Qt.MoveAction) != Qt.MoveAction: self.pieceLocations.insert(found, location) self.piecePixmaps.insert(found, pixmap) self.pieceRects.insert(found, square) self.update(self.targetSquare(event.pos())) if location == QPoint(square.x() / 80, square.y() / 80): self.inPlace += 1
def mouseMoveEvent(self, evt): """ Protected method to handle mouse move events. @param evt reference to the mouse event (QMouseEvent) """ if evt.button() == Qt.LeftButton and \ (evt.pos() - self.__dragStartPos).manhattanLength() > \ QApplication.startDragDistance() and \ self.__browser is not None: drag = QDrag(self) mimeData = QMimeData() title = self.__browser.title() if title == "": title = str(self.__browser.url().toEncoded(), encoding="utf-8") mimeData.setText(title) mimeData.setUrls([self.__browser.url()]) p = self.pixmap() if p: drag.setPixmap(p) drag.setMimeData(mimeData) drag.exec_()
def mouseMoveEvent(self, event): if event.buttons() == Qt.RightButton: # write the relative cursor position to mime data mimeData = QMimeData() # simple string with 'x,y' mimeData.setText('%d,%d' % (event.x(), event.y())) # let's make it fancy. we'll show a "ghost" of the button as we drag # grab the button to a pixmap pixmap = self.grab() # below makes the pixmap half transparent painter = QPainter(pixmap) painter.setCompositionMode(painter.CompositionMode_DestinationIn) painter.fillRect(pixmap.rect(), QColor(0, 0, 0, 127)) painter.end() # make a QDrag drag = QDrag(self) # put our MimeData drag.setMimeData(mimeData) # set its Pixmap drag.setPixmap(pixmap) # shift the Pixmap so that it coincides with the cursor position drag.setHotSpot(event.pos()) # start the drag operation # exec_ will return the accepted action from dropEvent if drag.exec_(Qt.CopyAction | Qt.MoveAction) == Qt.MoveAction: print('moved') else: print('copied:'+str(event.globalPos())) #self.move(event.pos()) elif event.buttons() == Qt.LeftButton: delta = QPoint(event.globalPos() - self.oldPos) self.move(self.frameGeometry().x() + delta.x(), self.frameGeometry().y() + delta.y()) self.oldPos = event.globalPos()
def mouseMoveEvent(self, mouseEvent): """ Executed when the mouse if moved while a button is being pressed. :type mouseEvent: QMouseEvent """ if mouseEvent.buttons() & Qt.LeftButton: # Exclude edges from drag&drop since we need to source and edge to insert it in the diagram. if Item.ConceptNode <= self.item <= Item.PropertyAssertionNode: distance = (mouseEvent.pos() - self.startPos).manhattanLength() if distance >= QApplication.startDragDistance(): mimeData = QMimeData() mimeData.setText(str(self.item.value)) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(self.pixmap) drag.setHotSpot(self.startPos - self.rect().topLeft()) drag.exec_(Qt.CopyAction) super().mouseMoveEvent(mouseEvent)
class MainView(QMainWindow): def __init__(self, model, controller): QWidget.__init__(self) self.controller = controller self.model = model # load QtDesigner UI self.ui = Ui_mainWindow() self.ui.setupUi(self) #### SETUP CircuitDiagramView and controller self.ui.circuitDiagram.model = self.model self.ui.circuitDiagram.controller = self.controller # connect to CircuitDiagramView mouse triggers self.ui.circuitDiagram.mousePress.connect(self.controller.circuitDiagramMousePress) self.ui.circuitDiagram.mouseMove.connect(self.controller.circuitDiagramMouseMove) self.ui.circuitDiagram.mouseRelease.connect(self.controller.circuitDiagramMouseRelease) #### SETUP TOOLBAR self.ui.wireMode.clicked.connect(self.setWireMode) self.ui.deleteMode.clicked.connect(self.setDeleteMode) self.ui.selectMode.clicked.connect(self.setSelectMode) self.ui.runMode.clicked.connect(self.setRunMode) self.ui.buildMode.clicked.connect(self.setBuildMode) self.toolbarComponents = [] self.ui.newBattery.componentType = ComponentType.Battery self.toolbarComponents.append(self.ui.newBattery) self.ui.newBulb.componentType = ComponentType.Bulb self.toolbarComponents.append(self.ui.newBulb) self.ui.newResistor.componentType = ComponentType.Resistor self.toolbarComponents.append(self.ui.newResistor) self.ui.newSwitch.componentType = ComponentType.Switch self.toolbarComponents.append(self.ui.newSwitch) self.ui.newButton.componentType = ComponentType.Button self.toolbarComponents.append(self.ui.newButton) self.ui.newAmmeter.componentType = ComponentType.Ammeter self.toolbarComponents.append(self.ui.newAmmeter) self.ui.newVoltmeter.componentType = ComponentType.Voltmeter self.toolbarComponents.append(self.ui.newVoltmeter) for toolbarButton in self.toolbarComponents: toolbarButton.setIcon(QIcon(QPixmap(self.ui.circuitDiagram.componentTypeToImageName(toolbarButton.componentType)))) toolbarButton.setIconSize(QSize(50, 50)) toolbarButton.mousePress.connect(self.controller.newComponentButtonMousePress) self.statusBar().showMessage('Ready') self.ui.actionNew.setShortcut('Ctrl+N') self.ui.actionNew.setStatusTip('New document') self.ui.actionOpen.triggered.connect(self.showFileDialog) self.ui.actionSave.triggered.connect(self.showSaveDialog) self.ui.actionSaveAs.triggered.connect(self.saveAs) self.ui.actionNew.triggered.connect(self.newFile) self.ui.actionSave.setShortcut('Ctrl+S') self.ui.actionSaveAs.setShortcut('Ctrl+Shift+S') self.ui.actionOpen.setShortcut('Ctrl+O') self.ui.actionNew.setShortcut('Ctrl+N') self.savePath = None def newFile(self): reply = QMessageBox.question(self, "Message", "Opening a new file overwrites the current file. Do you want to save the current file?", QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.Yes) if reply == QMessageBox.No: self.model.clearModel() elif reply == QMessageBox.Yes: self.showSaveDialog() self.statusBar().showMessage('Saved') def saveAs(self): fname = QFileDialog.getSaveFileName(self, 'Save file', 'breadboard.eagle') if fname[0]: self.savePath = fname[0] self.model.saveModel(fname[0]) self.statusBar().showMessage('Saved') def showFileDialog(self): reply = QMessageBox.question(self, "Message", "Opening a new file overwrites the current file. Do you want to save the current file?", QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.Yes) if reply == QMessageBox.No: fname = QFileDialog.getOpenFileName(self, 'Open file', '') if fname[0]: self.savePath = fname[0] if not self.model.readModel(fname[0]): QMessageBox.question(self, "Message", "Parsing failed. File may be corrupted.", QMessageBox.Cancel, QMessageBox.Cancel) else: self.statusBar().showMessage('File Opened. Ready') elif reply == QMessageBox.Yes: self.showSaveDialog() self.statusBar().showMessage('Saved') def showSaveDialog(self): if self.savePath is None: self.saveAs() else: self.model.saveModel(self.savePath) self.statusBar().showMessage('Saved') def newComponentButtonMousePress(self, componentType, event): self.ui.build.setChecked(True) self.ui.wireMode.setChecked(False) self.ui.deleteMode.setChecked(False) self.ui.selectMode.setChecked(True) self.controller.bulbsOff() self.model.reRender() self.cursorState = CursorState.NewComponentDragging self.newComponentType = componentType self.newComponentDrag = QDrag(self) self.newComponentDrag.setHotSpot(QPoint(self.ui.circuitDiagram.blockSideLength / 2, self.ui.circuitDiagram.blockSideLength / 2)) self.newComponentDrag.setMimeData(QMimeData()) self.newComponentDrag.setPixmap(QPixmap(self.ui.circuitDiagram.componentTypeToImageName(componentType)).scaled(self.ui.circuitDiagram.blockSideLength, self.ui.circuitDiagram.blockSideLength)) QApplication.setOverrideCursor(QCursor(Qt.ForbiddenCursor)) self.newComponentDrag.exec_(Qt.MoveAction) self.cursorState = CursorState.Select self.ui.selectMode.setChecked(True) self.updateCursor() def updateCursorAndToolButtons(self, mode, tool, mouseState): self.ui.selectMode.setChecked(False) self.ui.wireMode.setChecked(False) self.ui.deleteMode.setChecked(False) self.ui.runMode.setChecked(False) self.ui.buildMode.setChecked(False) if mode is Mode.Build: self.ui.buildMode.setChecked(True) if tool is Tool.Select: self.ui.selectMode.setChecked(True) if mouseState is MouseState.Dragging: QApplication.setOverrideCursor(QCursor(Qt.ClosedHandCursor)) else: QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor)) elif tool is Tool.Wire: self.ui.wireMode.setChecked(True) QApplication.setOverrideCursor(QCursor(Qt.CrossCursor)) elif tool is Tool.Delete: self.ui.deleteMode.setChecked(True) QApplication.setOverrideCursor(QCursor(Qt.CrossCursor)) elif tool is Tool.NewComponent: QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor)) elif mode is Mode.Run: QApplication.setOverrideCursor(QCursor(Qt.ArrowCursor)) self.ui.runMode.setChecked(True) def setRunMode(self): self.controller.mode = Mode.Run def setBuildMode(self): self.controller.mode = Mode.Build def setSelectMode(self): self.controller.tool = Tool.Select def setWireMode(self): self.ui.componentTypeLabel.hide() self.ui.componentType.hide() self.ui.closedLabel.hide() self.ui.closed.hide() self.ui.resistanceLabel.hide() self.ui.resistance.hide() self.ui.voltageLabel.hide() self.ui.voltage.hide() self.controller.tool = Tool.Wire def setDeleteMode(self): self.ui.componentTypeLabel.hide() self.ui.componentType.hide() self.ui.closedLabel.hide() self.ui.closed.hide() self.ui.resistanceLabel.hide() self.ui.resistance.hide() self.ui.voltageLabel.hide() self.ui.voltage.hide() self.controller.tool = Tool.Delete def closeEvent(self, event): reply = QMessageBox.question(self, "Message", "Do want to save your changes?", QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel, QMessageBox.Yes) if reply == QMessageBox.No: event.accept() elif reply ==QMessageBox.Yes: self.showSaveDialog() event.accept()