PyQt6でLineEditに日付を入力する際の簡略法

#  私の環境
>iMacOS vetura 13.2
プロセッサ　Intel Core i5
PyQt6　6.5.2

# 何に使うのか？
>PyQt6でデータの”input Form”を作っているとよく出くわすのが、年月日の入力をするLineEdit.
いちいち2023-12-01とか打ち込んでいると面倒なので、20231201と打ち込んだら2023-12-01となるようにしたいと考えました。
ついでに
・defメソッドは一つで、全てのLineEditに対応する
・8桁以外は受け付けない
・QLineEdit にフォーマットされた日付をセットする
・dataframeで使えるようにしてインスタンス変数に代入する
を含めてみました。

# 出来上がりのイメージ
![スクリーンショット 2023-12-19 11.08.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/c599098a-a859-051b-a519-d02e5119eb4b.png)

これに値をinputすると
![スクリーンショット 2023-12-19 11.10.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/2e3045e9-b913-ffcb-2a96-cde9c46dcb04.png)
こうなります。



# コードは以下の通りです。よろしければコピペして使ってみてください。
```python
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel, QLineEdit
from PyQt6.QtCore import Qt, QDate  # 入力した日付テキストを取得し、8桁の数字であることを確認
import PyQt6.QtCore as QtCore # QDateオブジェクトから年月日のみを取得する
# -------------------------------------------------------------
import pandas as pd
# -------------------------------------------------------------
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        # クラスのインスタンス変数として定義する
        # (検索の開始年月日)
        self.s_date = ""
        # (検索の終了年月日)
        self.e_date = ""
        # (保存するDataの年月日)
        self.tmp_date = ""
        
        self.initUI()
    # ---------------------------------------------------------
    def initUI(self):
        # ウインドウのタイトルを設定
        self.setWindowTitle("LineEditに入力された年月日の確認")
        # -----------------------------------------------------
        # レイアウトを設定
        layout = QVBoxLayout()
        self.setLayout(layout)
        # ---------------------------------------------------
        #Labelの設定
        self.lbl01 = QLabel('LineEditには20231130の様に\n羅列して入力')
        self.setLayout(layout)
        layout.addWidget(self.lbl01)
        # LineEditの設定
        # lnedt01
        self.lnedt01 = QLineEdit(self,placeholderText="保存年月日")
        self.lnedt01.textChanged.connect(self.format_date)
        self.setLayout(layout)
        layout.addWidget(self.lnedt01)
        # ----------------------------
        # LineEditの設定
        # lnedt02
        self.lnedt02 = QLineEdit(self,placeholderText="開始年月日")
        self.lnedt02.textChanged.connect(self.format_date)
        self.setLayout(layout)
        layout.addWidget(self.lnedt02)
        # ----------------------------
        # LineEditの設定
        # lnedt03
        self.lnedt03 = QLineEdit(self,placeholderText="終了年月日")
        self.lnedt03.textChanged.connect(self.format_date)
        self.setLayout(layout)
        layout.addWidget(self.lnedt03)
        # ----------------------------
        # 開始ボタンの設定
        self.start_btn = QPushButton('Enter',self,checkable=True)

        self.start_btn.clicked.connect(self.mainText)
        self.setLayout(layout)
        layout.addWidget(self.start_btn)
    # ------------------------------------------------------
    def format_date(self, text: str):# <-method名の修正可
        # 入力された数字が８桁であるかチェック
        if len(text) != 8 or not text.isdigit():
            return
        # 8桁であれば西暦年-月-日で表示
        year = int(text[0:4])
        month = int(text[4:6])
        day = int(text[6:8])

        date = QtCore.QDate(year, month, day)
        formatted_date = date.toString("yyyy-MM-dd")
        julian_day = date.toJulianDay()
        # ----------------------------
        # 送信元のLineEditを取得
        sender_widget = self.sender()
        # ----------------------------
        # 各 QLineEdit にフォーマットされた日付をセット
        if sender_widget == self.lnedt01:# <-Line Edit名の修正可
            self.lnedt01.setText(formatted_date)
        elif sender_widget == self.lnedt02:
            self.lnedt02.setText(formatted_date)
        elif sender_widget == self.lnedt03:
            self.lnedt03.setText(formatted_date)
        # ----------------------------
        # インスタンス変数には、各 QLineEdit に対応する変数に代入
        # (.date()はDFで利用するため年月日のみにする(時分秒は非表示))
        if sender_widget == self.lnedt01:# <-Line Edit名の修正可
            self.tmp_date = pd.to_datetime(formatted_date).date()# <-インスタンス変数名を確認
        elif sender_widget == self.lnedt02:
            self.s_date = pd.to_datetime(formatted_date).date()
        elif sender_widget == self.lnedt03:
            self.e_date = pd.to_datetime(formatted_date).date()
        # ---不要であればコメントアウト----
        # (確認)日付を返す
        print("self.tmp_date:", self.tmp_date)
        print("self.s_date:", self.s_date)
        print("self.e_date:", self.e_date)
    # ------------------------------------------------------
    def mainText(self):
        # インスタンス変数に代入されているか確認
        sv_date = self.tmp_date
        print(f'sv_date:{sv_date}')

        s_date = self.s_date
        print(f's_date:{s_date}')
        
        e_date = self.e_date
        print(f'e_date:{e_date}')
        
        
        
# -----------------------------------------------------------
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    app.exec()

```