baha joher
baha joher

Reputation: 84

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

Upvotes: 2

Views: 309

Answers (1)

eyllanesc
eyllanesc

Reputation: 243897

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_())

Upvotes: 1

Related Questions