たったこれだけです。
class Lineedit_allow_drag(QLineEdit): def __init__(self): super().__init__() self.setDragEnabled(True) def dragEnterEvent(self, e): if(e.mimeData().hasUrls()): e.accept() def dropEvent(self, e): urls = e.mimeData().urls() url = urls[0] self.setText(url.toLocalFile())
使い道
最近、Ubuntuを使うことがあります。やりたいことはフォルダまたはファイルのアドレスを二つ取得してシンボリックリンクを作成することです。以前こちらでやりました。touch-sp.hatenablog.com
ドラッグ&ドロップができるようになるとさらに使い勝手が良くなります。
Pythonスクリプト
from PySide6.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout, QLabel, QLineEdit, QPushButton from PySide6.QtCore import QSize import os import subprocess class Window(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setFixedSize(QSize(480, 120)) self.lineedit1 = Lineedit_allow_drag() self.lineedit2 = Lineedit_allow_drag() label1 = Mylabel("作成先のディレクトリ") label2 = Mylabel("ファイル or フォルダ") startBtn = Mybutton('作成') startBtn.clicked.connect(self.push_startBtn) layout = QGridLayout() layout.addWidget(label1, 0, 0, 1, 2) layout.addWidget(label2, 1, 0, 1, 2) layout.addWidget(self.lineedit1, 0, 2, 1, 4) layout.addWidget(self.lineedit2, 1, 2, 1, 4) layout.addWidget(startBtn, 2, 2, 1, 2) mainWindow = QWidget() mainWindow.setLayout(layout) self.setCentralWidget(mainWindow) def push_startBtn(self): directory = self.lineedit1.text() target = self.lineedit2.text() if os.path.isdir(target): subprocess.run(f"sudo ln -s -d {target} {directory}", shell=True) elif os.path.isfile(target): subprocess.run(f"ln -s {target} {directory}", shell=True) class Lineedit_allow_drag(QLineEdit): def __init__(self): super().__init__() self.setStyleSheet("font: 16px") self.setDragEnabled(True) def dragEnterEvent(self, e): if(e.mimeData().hasUrls()): e.accept() def dropEvent(self, e): urls = e.mimeData().urls() url = urls[0] self.setText(url.toLocalFile()) class Mylabel(QLabel): def __init__(self, text): super().__init__() self.setStyleSheet("font: 16px") self.setText(text) class Mybutton(QPushButton): def __init__(self, text): super().__init__() self.setStyleSheet("font: 16px") self.setText(text) if __name__ == "__main__": app = QApplication([]) window = Window() window.show() app.exec()
補足
UbuntuでPySide6を使う方法はこちら。touch-sp.hatenablog.com