PyQt работает с мастером и переключателем - PullRequest
2 голосов
/ 12 мая 2019

Я сделал этот мастер с переключателем.Когда она нажата, кнопка «Готово» должна вернуть список переключателей, которые были отмечены как текст!

Ввод (это виртуальный ввод для удобства чтения)

data=[['a','b','c'],['e','f'],['g','f']]
data1 = ['one','two','three']

это мой код

from PyQt4 import QtGui, QtCore

   def page3arg(x, n):
   page = QtGui.QWizardPage()
   page.setTitle("{}".format(x))
   page.setSubTitle("Please choose one of these state.")

   rd1 = QtGui.QRadioButton(page)
   rd2 = QtGui.QRadioButton(page)
   rd3 = QtGui.QRadioButton(page)

   layout = QtGui.QGridLayout()
   layout.addWidget(rd1, 2, 0)
   layout.addWidget(rd2, 2, 1)
   layout.addWidget(rd3, 2, 2)
   rd1.setText(' {}'.format(n[0]))
   rd2.setText(' {}'.format(n[1]))
   rd3.setText(' {}'.format(n[2]))
   page.setLayout(layout)

   return page


def page2arg(x, n):
    page = QtGui.QWizardPage()
    page.setTitle("{}".format(x))
    page.setSubTitle("Please choose one of these state.")

    rd1 = QtGui.QRadioButton(page)
    rd2 = QtGui.QRadioButton(page)

    layout = QtGui.QGridLayout()
    layout.addWidget(rd1, 2, 0)
    layout.addWidget(rd2, 2, 1)
    rd1.setText(' {}'.format(n[0]))
    rd2.setText(' {} .'.format(n[1]))

    page.setLayout(layout)
    return page

if __name__ == '__main__':

    import sys

    app = QtGui.QApplication(sys.argv)
    wizard = QtGui.QWizard()
    wizard.setStyleSheet(("font:50 10pt \"MS Shell Dlg 2\";"))

    for m in range(len(data1) - 1):
        x = data1[m]
        n= data[m]
        if len(n) == 3:
            page3 = page3arg(x, n)
            wizard.addPage(page3)
        elif len(n) == 2:
            page2 = page2arg(x, n)
            wizard.addPage(page2)
    wizard.show()
    sys.exit(wizard.exec_())

Как написать функцию, котораяполучит выбор переключателей в конце как список.

Список выбора переключателей должен выглядеть следующим образом:

output = ['a','e','g'] 

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Если вы хотите проверить радиокнопку, простое решение - связать ее с QButtonGroup для каждой страницы и использовать функцию checkedButton () , чтобы установить флажок.И чтобы знать, когда вы нажимаете кнопку завершения, вы должны использовать функцию button () QWizard и подключить ее к слоту.

Также не обязательно иметь 2 функции, которые выполняюттак же, как page3arg и page2arg, я сократил его в обобщенной функции для n аргументов

from PyQt4 import QtCore, QtGui


class Wizard(QtGui.QWizard):
    def __init__(self, parent=None):
        super(Wizard, self).__init__(parent)
        datas = [["a", "b", "c"], ["e", "f"], ["g", "f"]]
        titles = ["one", "two", "three"]
        self.setStyleSheet(('font:50 10pt "MS Shell Dlg 2";'))

        self.groups = []
        for title, options in zip(titles, datas):
            page, group = Wizard.create_page(title, options)
            self.addPage(page)
            self.groups.append(group)

        self.button(QtGui.QWizard.FinishButton).clicked.connect(
            self.on_finished
        )
        self._results = []

    @property
    def results(self):
        self.get_options()
        return self._results

    def get_options(self):
        self._results = []
        for group in self.groups:
            button = group.checkedButton()
            if button is not None:
                self._results.append(button.text())

    @QtCore.pyqtSlot()
    def on_finished(self):
        print("finished", self.results)


    @staticmethod
    def create_page(title, options):
        page = QtGui.QWizardPage()
        group = QtGui.QButtonGroup(page)
        page.setTitle(title)
        page.setSubTitle("Please choose one of these state.")
        hlay = QtGui.QHBoxLayout(page)
        for option in options:
            radiobutton = QtGui.QRadioButton(text=option)
            group.addButton(radiobutton)
            hlay.addWidget(radiobutton)
        return page, group


if __name__ == "__main__":

    import sys

    app = QtWidgets.QApplication(sys.argv)
    wizard = Wizard()
    wizard.show()
    ret = app.exec_()
    print("outside clas", wizard.results)
    sys.exit(ret)
0 голосов
/ 12 мая 2019

Попробуйте поместить все переключатели в список, и для каждого переключателя в списке получите его текст и вставьте его в свой выходной список. Например,

lst = []
lst.append(rd1)
lst.append(rd2)
lst.append(rd3)
output = []
for val in lst:
    output.append(val.text())
...