Python 如何在pyqt5的子窗口中使用dragEvent

Python 如何在pyqt5的子窗口中使用dragEvent,python,pyqt5,Python,Pyqt5,这是我的关键代码: from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPixmap, QImage, QCursor, QMovie from PyQt5.QtWidgets import QApplication, QMenu, QSystemTrayIcon, QLabel, QAction import sys class Desktop(QtWidgets.QWi

这是我的关键代码:

from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon, QPixmap, QImage, QCursor, QMovie
from PyQt5.QtWidgets import QApplication, QMenu, QSystemTrayIcon, QLabel, QAction
import sys
class Desktop(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        # init
        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.SubWindow)
        self.setAutoFillBackground(False)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.repaint()
        self.move((self.screen().availableGeometry().width() - 200),
              self.screen().availableGeometry().height() - 200) 
        self.setAcceptDrops(True)
        self.is_follow_mouse = False
        self.mouse_drag_pos = self.pos()
        self.op = QLabel(self)
        self.op.setText("Drag here")
        self.op.show()

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls:
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasUrls:
            try:
                event.setDropAction(Qt.CopyAction)
            except Exception as e:
                print(e)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        try:
            if event.mimeData().hasUrls:
                event.setDropAction(Qt.CopyAction)
                event.accept()
                for url in event.mimeData().urls():
                    print(str(url.toLocalFile()))
            else:
                event.ignore()
        except Exception as e:
            print(e)
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.is_follow_mouse = True
            self.mouse_drag_pos = event.globalPos() - self.pos()
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))
   
    def mouseMoveEvent(self, event):
        if Qt.LeftButton and self.is_follow_mouse:
            self.move(event.globalPos() - self.mouse_drag_pos)
            event.accept()

    def mouseReleaseEvent(self, event):
        self.is_follow_mouse = False
        self.setCursor(QCursor(Qt.ArrowCursor))
 if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = Desktop()
    widget.show()
    sys.exit(app.exec_())
当窗口是Qt时,这就起作用了

self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
然而,当我使用这个

 self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.SubWindow)
这不行!当我把一个文件、链接或其他东西拖到窗口中时,会出现一个停止标志,毫无例外


那么,我该怎么做才能修复它呢?谢谢

请提供@eyllanesc谢谢,我替换了这个例子我知道英语不是你的母语,但请在拼写技术术语时更加小心。这不是拖拽就是拖拽,这两个相关事件之间有很大的区别,因为有些情况下区分它们很重要,如果你写“拖拽”,我们就无法理解你指的是哪一个。@musicamante谢谢~,我会处理好的。请提供一个@eyllanesc谢谢,我理解英语不是你的母语,但请注意技术术语的拼写。这要么是拖拽,要么是拖拽,这两个相关事件之间有很大的区别,因为有些情况下区分它们很重要,如果你写“拖拽”,我们就无法理解你指的是哪一个。@musicamante谢谢~,我会处理好的