pythonpyqtpyqt4qwizard

pyqt wizard add page on end of wizard (setFinishButtonEarly)


im looking for resource to see some method in pyqt4 .

I have a finalPage that get the argument from the class wizard and want to show some result based on that argument ,and the finish button should be in the last of the class wizard and the finalPage got only the close button.

my code

from PyQt4 import QtCore, QtGui
import sys
from ex import dbconnect
data = [['Male', 0, 'cheap', 'Low', 'Bus'], ['Male', 1, 'cheap', 'Medium', 'Bus'], ['Female', 1, 'cheap', 'Medium', 'Train'], ['Female', 0, 'cheap', 'Low', 'Bus'], ['Male', 1, 'cheap', 'Medium', 'Bus'], ['Male', 0, 'standard', 'Medium', 'Train'], ['Female', 1, 'standard', 'Medium', 'Train'], ['Female', 1, 'expensive', 'High', 'Car'], ['Male', 2, 'expensive', 'Medium', 'Car'], ['Female', 2, 'expensive', 'High', 'Car']]
data1 = ['Gender', 'car ownership', 'Travel Cost', 'Income Level', 'Transportation mode']

#this class i got helped with it

class Wizard(QtGui.QWizard):

   def __init__(self):
       super(Wizard, self).__init__()
       datas = []
       for l in range(len(data1) - 2):
           y = []
           for row in data:
               x = row[l]
               if not x in y:
                   y.append(x)
           datas.append(y)
       titles = data1
       self.setStyleSheet(('font:50 10pt "MS Shell Dlg 2";'))
       self.setWindowTitle("Recommender System")

       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 = []
       self.show()

   @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=str(option))
           group.addButton(radiobutton)
           hlay.addWidget(radiobutton)
       return page, group

########################################################################################################################
#this passed from the class like the r = Wizard.results()

def finalpage(r):     
   page = QtGui.QWizardPage()
   page.setTitle("Conclusion!")

   list1 = QtGui.QListView()
   label2 = QtGui.QLabel('Based on these Ruls')
   label2.setStyleSheet(("font:50 10pt \"MS Shell Dlg 2\";"))
   model = QtGui.QStandardItemModel(list1)
   for m in r:
       item = QtGui.QStandardItem(str(m))
       model.appendRow(item)
       list1.setModel(model)
   layout = QtGui.QVBoxLayout()
   layout.addWidget(list1)
   page.setLayout(layout)
   return page

def run1():

   global data, data1
   app = QtGui.QApplication(sys.argv)
   if app is None:
       app = QtGui.QApplication([])
   wizard = Wizard()
   wizard.addpage(finalpage(wizard.results())
   sys.exit(app.exec_())
run1()

I don't know where and when to call the final page


Solution

  • If you want to get information from the QWizard or QWizardPage before you change pages, you must override the initializePage method.

    from PyQt4 import QtCore, QtGui
    
    data = [
        ["Male", 0, "cheap", "Low", "Bus"],
        ["Male", 1, "cheap", "Medium", "Bus"],
        ["Female", 1, "cheap", "Medium", "Train"],
        ["Female", 0, "cheap", "Low", "Bus"],
        ["Male", 1, "cheap", "Medium", "Bus"],
        ["Male", 0, "standard", "Medium", "Train"],
        ["Female", 1, "standard", "Medium", "Train"],
        ["Female", 1, "expensive", "High", "Car"],
        ["Male", 2, "expensive", "Medium", "Car"],
        ["Female", 2, "expensive", "High", "Car"],
    ]
    data1 = [
        "Gender",
        "car ownership",
        "Travel Cost",
        "Income Level",
        "Transportation mode",
    ]
    
    
    class Wizard(QtGui.QWizard):
        def __init__(self):
            super(Wizard, self).__init__()
            datas = []
            for l in range(len(data1) - 2):
                y = []
                for row in data:
                    x = row[l]
                    if not x in y:
                        y.append(x)
                datas.append(y)
            titles = data1
            self.setStyleSheet(('font:50 10pt "MS Shell Dlg 2";'))
            self.setWindowTitle("Recommender System")
    
            self.groups = []
            for title, options in zip(titles, datas):
                page, group = Wizard.create_page(title, options)
                self.addPage(page)
                self.groups.append(group)
    
            final_page = FinalPage()
            self.addPage(final_page)
    
        @property
        def results(self):
            return self.get_options()
    
        def get_options(self):
            results = []
            for group in self.groups:
                button = group.checkedButton()
                if button is not None:
                    results.append(button.text())
            return 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=str(option))
                group.addButton(radiobutton)
                hlay.addWidget(radiobutton)
            return page, group
    
    
    class FinalPage(QtGui.QWizardPage):
        def __init__(self, parent=None):
            super(FinalPage, self).__init__(parent)
            self.setTitle("Conclusion!")
    
            self._model = QtGui.QStandardItemModel(self)
    
            listview = QtGui.QListView()
            listview.setModel(self._model)
            label = QtGui.QLabel("Based on these Ruls")
            label.setStyleSheet(('font:50 10pt "MS Shell Dlg 2";'))
    
            lay = QtGui.QVBoxLayout(self)
            lay.addWidget(listview)
            lay.addWidget(label)
    
        def setResults(self, r):
            for m in r:
                item = QtGui.QStandardItem(str(m))
                self._model.appendRow(item)
    
        def initializePage(self):
            self.setResults(self.wizard().results)
    
    
    if __name__ == "__main__":
        import sys
    
        app = QtGui.QApplication(sys.argv)
        w = Wizard()
        w.show()
        sys.exit(app.exec_())