Python

【PySide2】テキストフィールドの入力を受け取る

shamimatsu

PySide2を勉強中で使いやすくするためにドラッグアンドドロップを色々試しています。
テキストフィールドにファイルを投げると名前が表示されて、ボタンを押すとそこに書かれている文字のダイアログを出すメモになります。

python3.9を使用

ボタンを押すとテキストフィールドの文字を出力

サンプル画像

コード

1import os.path
2import sys
3from PySide2.QtWidgets import (QPushButton, QWidget, QLineEdit, QApplication, QMessageBox, QVBoxLayout)
4
5
6class MyWindow(QWidget):
7    def __init__(self):
8        super().__init__()
9        self.initUI()
10
11    def initUI(self):
12        # ボタンを作成
13        button1 = QPushButton("ボタン1")
14        button1.setFixedWidth(100)
15        button1.clicked.connect(self.button_click)
16
17        # テキストフィールドclass呼び出し
18        self.text_field = DroppableLineEdit()
19        self.text_field.setText('empty')
20        self.text_field.setFixedWidth(400)
21
22        # レイアウトの設定
23        layout = QVBoxLayout()
24        layout.addWidget(self.text_field)
25        layout.addWidget(button1)
26        self.setLayout(layout)
27
28        self.setWindowTitle('テキスト出力')
29        self.setGeometry(500, 500, 400, 150)
30
31    def button_click(self):
32        text = self.text_field.text()
33        QMessageBox.information(self, '名前', text)
34
35
36# テキストフィールド
37class DroppableLineEdit(QLineEdit):
38    def __init__(self, *args, **kwargs):
39        super().__init__(*args, **kwargs)
40        self.setAcceptDrops(True)
41
42    def dragEnterEvent(self, event):
43        if event.mimeData().hasUrls():
44            event.accept()
45        else:
46            event.ignore()
47
48    def dropEvent(self, event):
49        if event.mimeData().hasText():
50            file_path = event.mimeData().text()
51            base_name = os.path.basename(file_path)
52            self.setText(base_name)
53            event.accept()
54
55
56if __name__ == '__main__':
57    app = QApplication(sys.argv)
58    ex = MyWindow()
59    ex.show()
60    app.exec_()

簡単な解説

AIにはかなりお世話になりました。ただ出てきたコードをそのまま使用してもエラーになったり求めていた処理ではないことがほとんどだったため、細かく分けて質問しました。

テキストフィールドがドラッグアンドドロップに対応したコードはclassをわけています。
別クラスの読み込み
self.text_field = DroppableLineEdit()
self.text_field.setText('empty')

ABOUT ME
shamimatsu
shamimatsu
3DCGデザイナー
ながらくゲーム業界で2D、3DCGデザイナーとして働いてきましたが、新しい業界に挑戦中です。 ブログのデザインをリニューアル中のため、見づらい箇所もあるかもしれませんが少しづつ修正していきます。
記事URLをコピーしました