def add_child(num_children, nesting_level):
    result = []
    if nesting_level == 0:
        return result
    for i in range(num_children):
        child = QStandardItem("Child num {}, nesting Level {}".format(
            i + 1, nesting_level))
        if i == 0:
            child.appendRow(add_child(num_children, nesting_level - 1))
        result.append(child)
    return result
    def create_combo_box_items(self):
        model = QStandardItemModel()
        self.ui.combo_classes.setModel(model)
        self.ui.combo_functions.setModel(model)
        for k, v in self.data.items():
            cls = QStandardItem(k)
            model.appendRow(cls)
            for value in v:
                func = QStandardItem(value)
                cls.appendRow(func)

        def update_combo_box(index):
            ind = model.index(index, 0, self.ui.combo_classes.rootModelIndex())
            self.ui.combo_functions.setRootModelIndex(ind)
            self.ui.combo_functions.show()
            self.ui.combo_functions.setCurrentIndex(0)
            self.ui.config_label.setText('')

        self.ui.combo_classes.currentIndexChanged.connect(update_combo_box)
    return result


if __name__ == '__main__':
    app = QApplication(sys.argv)
    model_size = 100000
    list = []
    source_model = QStandardItemModel()
    horizontal_header_list = [
        "First Column with spacing", "Second Column with spacing"
    ]
    source_model.setHorizontalHeaderLabels(horizontal_header_list)
    for i in range(model_size):
        first_item = QStandardItem("FancyTextNumber {}".format(i))
        if i == 0:
            first_item.appendRow(add_child(2, 2))
        second_item = QStandardItem("FancyRow2TextNumber {}".format(i))
        if i % 2 == 0:
            first_item.setBackground(Qt.red)
        row = [first_item, second_item]
        source_model.invisibleRootItem().appendRow(row)
        list.append("FancyTextNumber {}".format(i))

    # Needed by QMLModelViewClient
    role_names = {
        Qt.DisplayRole: QByteArray(b'_text'),
        Qt.BackgroundRole: QByteArray(b'_color')
    }
    source_model.setItemRoleNames(role_names)

    roles = [Qt.DisplayRole, Qt.BackgroundRole]