в PyQt5 перетащите ярлык с копированием ярлыка - PullRequest
0 голосов
/ 22 марта 2020

Я пытаюсь перетащить метку, где метка должна быть КОПИЕЙ оригинальной метки. Я пытаюсь сделать это с помощью «drag.exec_ (QtCore.Qt.CopyAction)», но, похоже, это неверный путь.

Код

from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
import os
from PyQt5.QtGui import *

class Label(QLabel):

    def __init__(self, title, parent):
        super(Label, self).__init__(title, parent)

    def mouseMoveEvent(self, e):
        if e.buttons() != Qt.RightButton:
            return
        drag = QDrag(self)
        mimedata = QMimeData()
        mimedata.setText(self.text())
        if mimedata.hasText():
            print("hattext")
        else:
            print("hasnotext")
        drag.setMimeData(mimedata)
        drag.exec_(QtCore.Qt.CopyAction) # NO difference to Qt.MoveAction

class MyTable(QTableWidget):

    def __init__(self, rows, columns, parent):
        super(MyTable, self).__init__(rows, columns, parent)
        self.setAcceptDrops(True)

    def dragMoveEvent(self, e):
        e.accept()

    def dragEnterEvent(self, e):
        e.accept()

    def dropEvent(self, e):
        print('in dropevent')
        if e.mimeData().hasText():
            indx = self.rowAt(e.pos().y())
            indy = self.columnAt(e.pos().x())
            print("index",indx, indy)
            self.setCellWidget(indx, indy, e.source())
            e.setDropAction(QtCore.Qt.CopyAction) #doesn't help anything
            e.accept()

class Example(QWidget):

    def __init__(self):
        super(Example, self).__init__()
        self.initUI()

    def initUI(self):
        self.table = MyTable(4,4,self)
        self.table.setAcceptDrops(True)
        self.table.setGeometry(100,100,300,300)
        self.setWindowTitle('test drag drop COPY')
        self.setGeometry(300, 300, 500, 500)

        self.myLabel = Label("myLbl",self)

def main():

    app = QApplication(sys.argv)
    ex = Example()
    ex.show()
    app.exec_()


if __name__ == '__main__':

    main()

В классе Label я использую оператор drag.exec_ (QtCore.Qt.CopyAction). Но это не имеет значения, если CopyAction или MoveAction, то, что я получаю, всегда MOVE! Также в dropEvent класса myTable нет разницы, если я использую CopyAction или MoveAction или полностью пропущу оператор.

Я проверил и протестировал множество примеров из учебных пособий или вопросов здесь в stackoverflow. CopyAction, кажется, работает в НЕТ примере.

Что не так с моим ожиданием, что CopyAction должен создать копию метки? (Не беспокойтесь о тексте метки, обычно я имею дело с jpg)

...