【PySide6】ドラッグ&ドロップでファイルやフォルダのアドレスを入力できる QLineEdit (または QTextEdit)を作成しました

たったこれだけです。

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




このエントリーをはてなブックマークに追加