Получение измененных данных из PyQt5 QDialog

У меня есть диалог конфигурации, который я предварительно заполняю существующими опциями, которые хранятся в cfg, Когда пользователь нажимает "Сохранить" (или эквивалентный), мне нужно получить новые значения из объектов QLineEdit. За исключением того, что я не могу понять это. Я гуглил и тестировал со вчерашнего вечера, прежде чем снова приехал сюда на колено. Вот мой код диалога (форма из Qt Designer, поэтому здесь нет кода GUI):

class Config(QDialog):
    def __init__(self):
        super(Config, self).__init__()

        popup = QDialog()
        config_ui = configform()
        config_ui.setupUi(popup)

        config_ui.programver.setText(cfg['config']['programver'])

        if cfg['config']['dummycopy']:
            config_ui.democheck.setChecked(True)

        config_ui.tmdbAPIkey.setText(cfg['config']['TMDB_KEY'])
        config_ui.tvdbAPIkey.setText(cfg['config']['TVDB_KEY'])
        config_ui.tvdbUserkey.setText(cfg['config']['TVDB_USERKEY'])

        theme = cfg['config']['theme']

        if theme == "blue":
            config_ui.bluebutton.setChecked(True)
        elif theme == "yellow":
            config_ui.yellowbutton.setChecked(True)
        elif theme == "light":
            config_ui.lightmetalbutton.setChecked(True)
        elif theme == "dark":
            config_ui.darkmetalbutton.setChecked(True)

        programversion = config_ui.programver.text()

        config_ui.savebutton.clicked.connect(lambda: Config.save(self, programversion))

        popup.exec_()


    def save(self, programversion):
        QDialog.close(self)
        print(programversion)

Мне нужно немного вуду, чтобы добраться до измененных полей. Все, что я могу сейчас получить - это исходные значения, когда диалог был воплощен в жизнь. Есть ли уловка с этим? Я не могу быть первым, кто попытается предварительно заполнить диалоговое окно. Клянусь, я перепробовал все возможные комбинации кнопок и ButtonBox.

Я думаю, может быть есть какой-то способ скрыть диалог, захватить данные, а затем уничтожить диалог? Во всяком случае, это одна рабочая теория.

Заранее спасибо.

1 ответ

Решение

Чтобы работать простым способом, мы используем дизайн Qt Designer для заполнения диалога и подключаем кнопку отмены к self.reject (), а кнопку сохранения к слоту save (), в этом мы сохраняем данные и выдаем self.accept ():

from PyQt5.QtWidgets import *
from Ui_config_dialog import Ui_configdialog
import configparser


class Config(QDialog, Ui_configdialog):
    def __init__(self, *args, **kwargs):
        QDialog.__init__(self, *args, **kwargs)
        self.setupUi(self)
        self.cancelbutton.clicked.connect(self.reject)
        self.filename = "joe.conf"
        self.cfg = configparser.ConfigParser()
        self.cfg.read(self.filename)
        self.load()

    def load(self):
        self.programver.setText(self.cfg['config']['programver'])
        self.democheck.setChecked(self.cfg.getboolean("config", "dummycopy"))
        self.tmdbAPIkey.setText(self.cfg['config']['TMDB_KEY'])
        self.tvdbAPIkey.setText(self.cfg['config']['TVDB_KEY'])
        self.tvdbUserkey.setText(self.cfg['config']['TVDB_USERKEY'])
        theme = self.cfg['config']['theme']

        self.buttons = {"blue": self.bluebutton, 
                        "yellow": self.yellowbutton,
                        "light": self.lightmetalbutton,
                        "dark": self.darkmetalbutton}

        self.buttons[theme].setChecked(True)
        self.group = QButtonGroup(self)
        self.group.addButton(self.bluebutton)
        self.group.addButton(self.yellowbutton)
        self.group.addButton(self.lightmetalbutton)
        self.group.addButton(self.darkmetalbutton)
        self.savebutton.clicked.connect(self.save)

    def save(self):
        self.cfg['config']['programver'] = self.programver.text()
        self.cfg['config']['dummycopy'] = "True" if self.democheck.isChecked() else "False"
        self.cfg['config']['TMDB_KEY'] = self.tmdbAPIkey.text()
        self.cfg['config']['TVDB_KEY'] = self.tvdbUserkey.text()
        for key, btn in self.buttons.items():
            if btn == self.group.checkedButton():
                 self.cfg['config']['theme'] = key
                 break

        with open(self.filename, 'w') as configfile: 
            self.cfg.write(configfile)
        self.accept()


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    w = Config()
    w.show()
    sys.exit(app.exec_())
Другие вопросы по тегам