LINUX.ORG.RU

Python, Qt: передача значения QRadioButton и использование его в QPushButton

 , , ,


0

2

Приветствую. Попробую объяснить задачу: есть окно, где пользователю предлагается выбрать из 3 доступных опций, в моем случае - шеллов, и применить их кнопкой Apply. Нужно каким-то образом записать значение в выбранный QRadioButton, чтобы потом применить его при нажатии на кнопку Apply (так как это будет команда для изменения шелла, то буду использовать subrocess.run и команду pkexec chsh -s «значение с QRadioButton „имя юзера“). Подскажите пожалуйста, как это правильно реализовать?

class ShellSelectWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setFixedSize(400, 150)
        self.setWindowTitle("Change shell")
        self.setupUi()
        vbox3 = QVBoxLayout()
        vbox3.addWidget(self.groupBox3)
        self.setLayout(vbox3)
        self.show()

    def setupUi(self):
        Hlayout = QHBoxLayout()
        Vlayout = QVBoxLayout()

        self.groupBox3 = QGroupBox("Select shell:")

        self.btnBash = QRadioButton("Bash (Default)")
        self.btnBash.setChecked(True)
        self.btnBash.toggled.connect(self.setBash)
        self.btnZSH = QRadioButton("ZSH")
        self.btnZSH.toggled.connect(self.setZSH)
        self.btnFish = QRadioButton("Fish")
        self.btnFish.toggled.connect(self.setFish)
        
        self.buttonBox = QDialogButtonBox()
        self.buttonBox.addButton("Apply", QDialogButtonBox.AcceptRole)
        self.buttonBox.addButton("Cancel", QDialogButtonBox.RejectRole)
        self.buttonBox.rejected.connect(self.cancel)

        Hlayout.addWidget(self.btnBash)
        Hlayout.addWidget(self.btnZSH)
        Hlayout.addWidget(self.btnFish)
        Vlayout.addLayout(Hlayout)
        Vlayout.addWidget(self.buttonBox)
        self.groupBox3.setLayout(Vlayout)

    def setBash(self):
        rbtn = self.sender()
        if rbtn.isChecked() == True:
            print("Toggled")

    def setZSH(self):
        rbtn = self.sender()
        if rbtn.isChecked() == True:
            print("Toggled")

    def setFish(self):
        rbtn = self.sender()
        if rbtn.isChecked() == True:
            print("Toggled")

    def cancel(self):
        self.close()

★★★★★

Последнее исправление: Sunderland93 (всего исправлений: 1)

Если я правильно понимаю, можно поместить нужное значение в переменную, при клике на соответствующий QRadioButton в функции, но как получить доступ к этой переменной из другой функции правильно?

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от AntonI

Сделал переменные доступными из функции, но как теперь их правильно привязать к кнопке, в зависимости от выбранного варианта?

def setBash(self):
        if self.btnBash.isChecked:
            self.bash = "/bin/bash"
            return self.bash

    def setZsh(self):
        if self.btnZSH.isChecked:
            self.zsh = "/bin/zsh"
            return self.zsh

    def setFish(self):
        if self.btnFish.isChecked:
            self.fish = "/bin/fish"
            return self.fish

    def apply(self):

Sunderland93 ★★★★★
() автор топика
Последнее исправление: Sunderland93 (всего исправлений: 1)
Ответ на: комментарий от Sunderland93

Присвой к сигналу toggle у btnBash, btnZSH и btnFish слот atToggle. В слоте atToggle должна быть общая переменная chosen_shell, куда записываешь выбранную оболочку.

За тем остаётся только к сигналу clicked у кнопки apply добавить слот onApplyClicked, а там уже делаешь что-то типа setShell(chosen_shell).

P. S. Python не знаю, но надеюсь понятно объяснил.

Dr64h ★★
()