第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

PyQt5 拖放到系統(tǒng)文件資源管理器中(帶有延遲編碼)?

PyQt5 拖放到系統(tǒng)文件資源管理器中(帶有延遲編碼)?

青春有我 2023-10-18 16:39:53
我想讓用戶通過將項(xiàng)目從 PyQt 拖到系統(tǒng)文件資源管理器來創(chuàng)建文件。由于某些文件非常大,我還需要延遲將數(shù)據(jù)設(shè)置為用戶完成放置時(shí),而不是立即開始拖動(dòng)。這個(gè)例子似乎是我需要的:https://doc.qt.io/archives/4.6/draganddrop-delayedencoding.html我嘗試將其轉(zhuǎn)換為簡單的 PyQt5 版本,其中將 QPushButton 拖動(dòng)到文件夾中將創(chuàng)建一個(gè)純文本文件,但它對(duì)我不起作用...當(dāng)我運(yùn)行它時(shí),刪除不會(huì)執(zhí)行任何操作,我的光標(biāo)如下所示:import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsimport typingimport timeclass MimeData(QtCore.QMimeData):    dataRequested = QtCore.pyqtSignal(str)    def formats(self) -> typing.List[str]:        return QtCore.QMimeData.formats(self) + ["text/plain"]    def retrieveData(self, mime_type: str, preferred_type: QtCore.QVariant.Type):        self.dataRequested.emit(mime_type)        return QtCore.QMimeData.retrieveData(self, mime_type, preferred_type)class SourceWidget(QtWidgets.QWidget):    mimeData: MimeData = None    def __init__(self, parent=None):        super().__init__(parent)        layout = QtWidgets.QVBoxLayout()        button = QtWidgets.QPushButton("Drag Me")        button.pressed.connect(self.start_drag)        layout.addWidget(button)        self.setLayout(layout)    @QtCore.pyqtSlot()    def create_data(self, mime_type):        if mime_type == "text/plain":            time.sleep(0.25)  # Simulate large file            self.mimeData.setData("text/plain", b"my text file contents")    @QtCore.pyqtSlot()    def start_drag(self):        self.mimeData = MimeData()        self.mimeData.dataRequested.connect(self.create_data)        drag = QtGui.QDrag(self)        drag.setMimeData(self.mimeData)        drag.exec(QtCore.Qt.CopyAction)if __name__ == "__main__":    app = QtWidgets.QApplication.instance() or QtWidgets.QApplication(sys.argv)    w = SourceWidget()    w.show()    app.exec_()
查看完整描述

1 回答

?
慕的地8271018

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊

這是我最終將文件從 PyQt5 拖放到文件資源管理器中的結(jié)果,并且只有在釋放鼠標(biāo)以完成放置時(shí)才寫入文件。



import time


from PyQt5 import QtCore, QtGui, QtWidgets

from PyQt5.QtCore import Qt


import tempfile

import os


# Use win32api on Windows because the pynput and mouse packages cause lag

# https://github.com/moses-palmer/pynput/issues/390

if os.name == 'nt':

    import win32api



    def mouse_pressed():

        return win32api.GetKeyState(0x01) not in [0, 1]

else:

    import mouse



    def mouse_pressed():

        return mouse.is_pressed()



class DelayedMimeData(QtCore.QMimeData):

    def __init__(self):

        super().__init__()

        self.callbacks = []


    def add_callback(self, callback):

        self.callbacks.append(callback)


    def retrieveData(self, mime_type: str, preferred_type: QtCore.QVariant.Type):

        mp = mouse_pressed()

        if not mp:

            for callback in self.callbacks.copy():

                self.callbacks.remove(callback)

                callback()


        return QtCore.QMimeData.retrieveData(self, mime_type, preferred_type)



class Navigator(QtWidgets.QTreeWidget):

    def __init__(self):

        super().__init__()


        self.setHeaderLabels(["Name"])

        QtWidgets.QTreeWidgetItem(self, ['Test1'])

        QtWidgets.QTreeWidgetItem(self, ['Test2'])

        QtWidgets.QTreeWidgetItem(self, ['Test3'])


        self.setAcceptDrops(True)

        self.setDragEnabled(True)

        self.setDragDropMode(self.DragDrop)

        self.setDefaultDropAction(Qt.MoveAction)

        self.setSelectionMode(self.ExtendedSelection)

        self.setSelectionBehavior(self.SelectRows)


        self.setContextMenuPolicy(Qt.CustomContextMenu)


    def startDrag(self, actions):

        drag = QtGui.QDrag(self)

        names = [item.text(0) for item in self.selectedItems()]

        mime = DelayedMimeData()

        path_list = []

        for name in names:

            path = os.path.join(tempfile.gettempdir(), 'DragTest', name + '.txt')

            os.makedirs(os.path.dirname(path), exist_ok=True)

            print(path)


            def write_to_file(path=path, name=name, widget=self):

                with open(path, 'w+') as f:

                    print("Writing large file(s)...")

                    time.sleep(2)  # Sleep to simulate long file write

                    f.write(f"Contents of {name}")


            mime.add_callback(write_to_file)

            path_list.append(QtCore.QUrl.fromLocalFile(path))


        mime.setUrls(path_list)

        mime.setData('application/x-qabstractitemmodeldatalist',

                     self.mimeData(self.selectedItems()).data('application/x-qabstractitemmodeldatalist'))

        drag.setMimeData(mime)

        drag.exec_(Qt.MoveAction)

        super().startDrag(actions)



app = QtWidgets.QApplication([])


nav = Navigator()

nav.show()

app.exec_()


查看完整回答
反對(duì) 回復(fù) 2023-10-18
  • 1 回答
  • 0 關(guān)注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)