Поле регистрации мастера PyQt в виде строки, а не целого числа

Я пытаюсь создать Мастер с использованием PyQt5 и пытаюсь сделать так, чтобы ввод, введенный пользователем на одной странице, влиял на то, что пользователь увидит на следующей странице. Однако, когда я пытаюсь это сделать, я вижу только значение индекса, а не текст.

Создание списка и последующее сопоставление значения индекса с соответствующим местоположением в списке, чтобы получить строку, выглядит немного неудобно, так кто-нибудь знает, есть ли в PyQt улучшенная встроенная функция, которая это делает?

class IntroductionPage(QtWidgets.QWizardPage):
    def __init__(self,*args,**kwargs):
        super().__init__()
        self.setTitle("Project Name")
        self.setSubTitle("Please select one of the available projects below")
        l = get_projects() 

        comboBox = QtWidgets.QComboBox(self)
        [comboBox.addItem(i) for i in l]
        layout = QtWidgets.QGridLayout()
        layout.addWidget(comboBox)
        self.setLayout(layout)
        self.registerField("projectName",comboBox)

class TaskPage(QtWidgets.QWizardPage):
    def __init__(self,*args,**kwargs):
        super().__init__()

    # currently returns an integer and not a string
    def initializePage(self):
        self.setTitle(self.field("projectName"))


class My_Wizard(QtWidgets.QWizard):
    num_of_pages = 2
    (intro,task) = range(num_of_pages)

    def __init__(self,*args,**kwargs):
        super(My_Wizard,self).__init__(*args,**kwargs)
        self.setPage(self.intro,IntroductionPage(self))
        self.setPage(self.task,TaskPage(self))
        self.setStartId(self.intro)

2 ответа

Решение

registerField() Метод имеет больше параметров:

void QWizardPage:: registerField (const QString & name, QWidget * widget, const char * property = nullptr, const char * updatedSignal = nullptr)

Таким образом, решение состоит в том, чтобы указать, что вы хотите получить currentText собственность QComboBox:

self.registerField("projectName", comboBox, "currentText")

искал этот ответ некоторое время, так какregisterField()принимает свойство в качестве параметра.

в вашем мастере вы можете установить пользовательское свойство, например, если вы должны были использовать табличный виджет, который не имеетgetвстроенная функциональность для массового получения всей таблицы.

так что вы можете сделать что-то вроде этого

      
class SplitWizardPage(QWizardPage):
    def __init__(self, table_data, table_headers):
        super().__init__()

        self.table_data = table_data
        self.table_headers = table_headers

        self.table_widget = QTableWidget()
        self.table_widget.setProperty("mutated_table_data", [])

...

def on_cell_changed(self, row, column):
     ...some get data code
     self.table_widget.setProperty("mutated_table_data", table_data)

...

finally 

        self.table_widget.cellChanged.connect(lambda: on_cell_changed(self, row, column))

        self.registerField("split_table_data", self.table_widget, "mutated_table_data", self.table_widget.cellChanged)

окончательно.

wizard.finished.connect(lambda: print(wizard.field("split_table_data")))

как видите, мы присоединяем его к свойству mutated_table_data в поле виджета.

Другие вопросы по тегам