MapleStory Finger Point

Development/GUI

QSettings 사용 예제 코드

吳鍾振 2022. 7. 26. 23:01
#!/usr/bin/env python3

import sys
from PySide6.QtCore import QSettings
from PySide6.QtCore import QCoreApplication, QMetaObject
from PySide6.QtWidgets import QFrame, QGridLayout, QLabel, \
    QLineEdit, QPushButton, QSizePolicy, QWidget
from PySide6.QtWidgets import QDialog
from PySide6.QtCore import Qt


# Ui
class Ui_Dialog(object):
    def setupUi(self, Dialog):
        if not Dialog.objectName():
            Dialog.setObjectName(u"Dialog")
        Dialog.resize(290, 200)
        self.gridLayout = QGridLayout(Dialog)
        self.gridLayout.setObjectName(u"gridLayout")
        self.gridWidget = QWidget(Dialog)
        self.gridWidget.setObjectName(u"gridWidget")
        self.gridLayout_2 = QGridLayout(self.gridWidget)
        self.gridLayout_2.setObjectName(u"gridLayout_2")
        self.id_lineEdit = QLineEdit(self.gridWidget)
        self.id_lineEdit.setObjectName(u"id_lineEdit")
        self.id_lineEdit.setStyleSheet(u"background-color: #ffffff;")

        self.gridLayout_2.addWidget(self.id_lineEdit, 2, 0, 1, 1)

        self.alert_label = QLabel(self.gridWidget)
        self.alert_label.setObjectName(u"alert_label")
        self.alert_label.setEnabled(True)
        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.alert_label.sizePolicy().hasHeightForWidth())
        self.alert_label.setSizePolicy(sizePolicy)
        self.alert_label.setStyleSheet(u"color:#ff0000;")
        self.alert_label.setFrameShadow(QFrame.Plain)
        self.alert_label.setTextFormat(Qt.AutoText)
        self.alert_label.setAlignment(Qt.AlignCenter)

        self.gridLayout_2.addWidget(self.alert_label, 5, 0, 1, 1)

        self.pw_lineEdit = QLineEdit(self.gridWidget)
        self.pw_lineEdit.setObjectName(u"pw_lineEdit")
        self.pw_lineEdit.setStyleSheet(u"background-color: #ffffff;")
        self.pw_lineEdit.setEchoMode(QLineEdit.Password)

        self.gridLayout_2.addWidget(self.pw_lineEdit, 3, 0, 1, 1)

        self.gridLayout.addWidget(self.gridWidget, 0, 0, 1, 1)

        self.login_button = QPushButton(Dialog)
        self.login_button.setObjectName(u"login_button")

        self.gridLayout.addWidget(self.login_button, 1, 0, 1, 1)

        self.retranslateUi(Dialog)
        QMetaObject.connectSlotsByName(Dialog)

    # setupUi

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Login", None))
        self.id_lineEdit.setPlaceholderText(QCoreApplication.translate("Dialog", u"ID", None))
        self.alert_label.setText("")
        self.pw_lineEdit.setPlaceholderText(QCoreApplication.translate("Dialog", u"Password", None))
        self.login_button.setText(QCoreApplication.translate("Dialog", u"Login", None))
    # retranslateUi


# Setting value
class MySetting:
    settings = QSettings('Setting', 'hi~')

    defaults = {
        'login_id': 'admin',
        'login_pw': '1234'
    }

    @classmethod
    def set(cls, key, value):
        cls.settings.setValue(key, value)

    @classmethod
    def get(cls, key):
        return cls.settings.value(
            key,
            cls.defaults[key],
            type(cls.defaults[key])
        )

    @classmethod
    def restore_defaults(cls):
        for key, value in cls.defaults.items():
            cls.set(key, value)


# Main Code
class LoginWindow(QDialog, Ui_Dialog):

    def __init__(self):
        super(LoginWindow, self).__init__()

        self.setupUi(self)
        self.setWindowFlag(Qt.WindowContextHelpButtonHint, False)

        self.login_button.clicked.connect(self.login_click)
        self.login_button.setShortcut('Return')

        self.id = MySetting.get('login_id')
        self.pw = MySetting.get('login_pw')

        self.flag = 0

    def login_click(self):
        if self.id_lineEdit.text() == self.id and self.pw_lineEdit.text() == self.pw:
            self.close()
        else:
            self.alert_label.setText('ID or P/W is not correct')
            self.flag = self.flag + 1

            if self.flag >= 5:
                self.alert_label.setText('P/W = 1 + 2 + 3 + 4')

                if self.flag > 6:
                    self.close()
                    sys.exit()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Escape:
            pass


if __name__ == '__main__':
    from PySide6.QtWidgets import QApplication

    app = QApplication(sys.argv)
    window = LoginWindow()
    window.show()
    sys.exit(app.exec())

QSetting으로 간단한 예제 프로그램을 작성해 보았다.
QSetting 안에 있는 login_id, login_pw 값은 사용자가 수정하지 않는 이상 바뀌지 않는다.
또한 계속 저장되는 특성을 가지고 있어 데이터 관리에 용이하다.

테스트 프로그램으로 로그인 창을 만들어 보았다.
다음에는 Setting 값을 수정할 수 있는 프로그램을 만들어 볼 예정

반응형