示例#1
0
 def add_records_btn_click(self):
     self.model.appendRow([
         QStandardItem("row %s, column %s" % (5, 0)),
         QStandardItem("row %s, column %s" % (6, 1)),
         QStandardItem("row %s, column %s" % (7, 2)),
         QStandardItem("row %s, column %s" % (8, 3)),
     ])
示例#2
0
    def __init__(self, parent, info, title="Channel Properties"):
        super().__init__(parent)
        self.setWindowTitle(title)

        self.model = QStandardItemModel(info["nchan"], 4)
        self.model.setHorizontalHeaderLabels(["#", "Label", "Type", "Bad"])
        for index, ch in enumerate(info["chs"]):
            item = QStandardItem()
            item.setData(index, Qt.DisplayRole)
            item.setFlags(item.flags() & ~Qt.ItemIsEditable)
            self.model.setItem(index, 0, item)
            self.model.setItem(index, 1, QStandardItem(ch["ch_name"]))
            kind = channel_type(info, index).upper()
            self.model.setItem(index, 2, QStandardItem(str(kind)))
            bad = QStandardItem()
            bad.setData(ch["ch_name"] in info["bads"], Qt.UserRole)
            bad.setCheckable(True)
            bad.setEditable(False)
            checked = ch["ch_name"] in info["bads"]
            bad.setCheckState(Qt.Checked if checked else Qt.Unchecked)
            self.model.setItem(index, 3, bad)

        self.model.itemChanged.connect(bad_changed)
        self.proxymodel = MySortFilterProxyModel()
        self.proxymodel.setDynamicSortFilter(False)
        self.proxymodel.setSourceModel(self.model)

        self.view = QTableView()
        self.view.setModel(self.proxymodel)
        self.view.setItemDelegateForColumn(2, ComboBoxDelegate(self.view))
        self.view.setEditTriggers(QAbstractItemView.AllEditTriggers)
        self.view.verticalHeader().setVisible(False)
        self.view.horizontalHeader().setStretchLastSection(True)
        self.view.setShowGrid(False)
        self.view.setSelectionMode(QAbstractItemView.NoSelection)
        self.view.setSortingEnabled(True)
        self.view.sortByColumn(0, Qt.AscendingOrder)

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.view)
        self.buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
        vbox.addWidget(self.buttonbox)
        self.buttonbox.accepted.connect(self.accept)
        self.buttonbox.rejected.connect(self.reject)

        self.resize(475, 650)
        self.view.setColumnWidth(0, 70)
        self.view.setColumnWidth(1, 155)
        self.view.setColumnWidth(2, 90)
示例#3
0
    def add_bridge_nodes(self, parent, sig_trie):
        bridge_item = QStandardItem('(bridge)')
        parent.appendRow([bridge_item, QStandardItem('')])

        def visit(func, visited):
            if func is None or func in visited: return
            visited.add(func)
            if func.is_bridge:
                self.add_func_node(bridge_item, QStandardItem(''), func)
            for callee in func.callees.values():
                visit(callee, visited)

        visited = set()
        for func in sig_trie.all_values():
            visit(func, visited)
示例#4
0
    def add_trie_node(self, parent, pattern_text, node):
        left_item = QStandardItem(pattern_text)

        if not node.value:  # Stem node
            parent.appendRow([left_item, QStandardItem('')])
        else:  # Leaf node
            self.add_func_node(parent, left_item, node.value[0])
            for func in node.value[1:]:
                self.add_func_node(parent, QStandardItem(''), func)

        pairs = map(lambda node: (str(node.pattern), node),
                    node.children.values())
        pairs = sorted(pairs, key=lambda kv: kv[0].replace('?', '\xff'))
        for text, child in pairs:
            self.add_trie_node(left_item, text, child)
        return left_item
示例#5
0
def _create_item(url, title, icon):
    result = QStandardItem(title)
    result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
    result.setData(url, _url_role)
    if icon is not None:
        result.setIcon(icon)
    return result
示例#6
0
    def __init__(self, arg=None):
        super(Table, self).__init__(arg)
        # 设置窗体的标题和初始大小
        self.setWindowTitle("QTableView 表格视图控件的例子")
        self.resize(600, 300)

        # 准备数据模型,设置数据层次结构为6行5列
        self.model = QStandardItemModel(6, 5)
        # 设置数据栏名称
        self.model.setHorizontalHeaderLabels(['标题1', '标题2', '标题3', '标题4',  '标题5'])

        for row in range(6):
            for column in range(5):
                item = QStandardItem("行 %s, 列 %s" % (row, column ))
                self.model.setItem(row, column, item)

        # 实例化表格视图,设置模型为自定义的模型
        self.tableView = QTableView()
        self.tableView.setModel(self.model)

        ############ 下面代码让表格 100% 的填满窗口
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 局部布局
        vboxLayout = QVBoxLayout()
        vboxLayout.addWidget(self.tableView)
        # 全局布局
        wl = QVBoxLayout(self)
        wl.addLayout(vboxLayout)
示例#7
0
 def visit(func, visited):
     if func is None or func in visited: return
     visited.add(func)
     if func.is_bridge:
         self.add_func_node(bridge_item, QStandardItem(''), func)
     for callee in func.callees.values():
         visit(callee, visited)
示例#8
0
 def programListUpdated(self, programs, current_program):
     print(programs)
     print(current_program)
     self.closeWaitDialog()
     self.programsListModel.clear()
     for p in programs:
         item = QStandardItem(p)
         if p == current_program:
             item.setForeground(QBrush(QColor(0, 0, 255, 127)))
         self.programsListModel.appendRow(item)
示例#9
0
文件: qt.py 项目: FFY00/ViewSB
        def populate(self, raw_data):
            """ Populate the hex and ASCII items.

            Args:
                raw_data -- bytes object containing the raw binary data to be displayed.
            """
            def row_column_enumerate(iterable):
                """ Turns the index into row-column coordinates suitable for a hexview."""
                for index, value in enumerate(iterable):
                    yield divmod(index, self.model().columnCount() // 2), value

            self.hex_data = raw_data

            model = self.model()

            # Reset.
            # Note: We're not using clear() as that would also clear e.g. column settings.
            model.setRowCount(0)

            # Calculate how many rows we need.
            bytes_per_row = model.columnCount() // 2
            data_len = len(raw_data)
            needed_rows = math.ceil(data_len / bytes_per_row)

            model.setRowCount(needed_rows)

            address_labels = [
                '{:04X}'.format(i) for i in range(0, data_len, bytes_per_row)
            ]
            model.setVerticalHeaderLabels(address_labels)

            for (row, col), byte in row_column_enumerate(raw_data):

                hex_item = QStandardItem('{:02X}'.format(byte))
                char = chr(byte)
                if char in string.printable:
                    ascii_item = QStandardItem(char)
                else:
                    ascii_item = QStandardItem('·')

                model.setItem(row, col, hex_item)
                model.setItem(row, self._to_corresponding_column(col),
                              ascii_item)
    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)
示例#11
0
文件: qt.py 项目: FFY00/ViewSB
        def __init__(self, *args, **kwargs):

            super().__init__(*args, **kwargs)

            font = QFont('monospace', 8)
            font.setStyleHint(QFont.Monospace)
            self.setFont(font)
            self.setShowGrid(False)
            self.horizontalHeader().hide()
            self.verticalHeader().setSectionResizeMode(
                QtWidgets.QHeaderView.Fixed)
            self.verticalHeader().setHighlightSections(False)
            self.horizontalHeader().setHighlightSections(False)
            self.verticalHeader().setSectionsClickable(False)

            # Don't let the user edit the table cells.
            self.setEditTriggers(self.NoEditTriggers)

            self.setSelectionBehavior(QAbstractItemView.SelectItems)
            self.setSelectionMode(QAbstractItemView.ContiguousSelection)

            self.setModel(QStandardItemModel(1, 33))

            # This will store the raw data that is displayed in the hex view.
            self.hex_data = None

            # Determine how wide ASCII columns should be.
            self.ascii_width = self.fontMetrics().horizontalAdvance('m')

            # HACK: Get how much space a hex item needs by asking temporarily creating one, and then asking Qt,
            # because self.fontMetrics().width('mm') isn't enough, apparently, unlike above.
            self.model().setItem(0, 0, QStandardItem('mm'))
            self.resizeColumnToContents(0)
            self.hex_width = self.visualRect(self.model().createIndex(
                0, 0)).width()

            # Default to 16 hex columns, with 16 ASCII columns, and one separator column, for a total of 33.
            self._set_bytes_per_row(16)

            # HACK: Get how much space is needed for 16 bytes per row by
            # getting the left and right bound of the left-most and right-most items, respectively.
            start = self.visualRect(self.model().createIndex(0, 0)).left()
            end = self.visualRect(self.model().createIndex(0, 32)).right()
            self.full_width = end - start

            # Record the default background color for items, since apparently that's platform dependent.
            # Note: Normally we can only get the default background color if there's actually an item there,
            # but we made one earlier to determine the value for self.hex_width, so we don't need to do it again.
            self.default_background_color = self.model().item(0,
                                                              0).background()

            self.model().setRowCount(0)

            self.selectionModel().selectionChanged.connect(
                self._selection_changed)
示例#12
0
    def __init__(self, parent, rows, selected=None, disabled=None):
        super().__init__(parent)
        self.setWindowTitle("Select XDF Stream")

        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels(
            ["ID", "Name", "Type", "Channels", "Format", "Sampling Rate"])

        for index, stream in enumerate(rows):
            items = []
            for item in stream:
                tmp = QStandardItem()
                tmp.setData(item, Qt.DisplayRole)
                items.append(tmp)
            for item in items:
                item.setEditable(False)
                if disabled is not None and index in disabled:
                    item.setFlags(Qt.NoItemFlags)
            self.model.appendRow(items)

        self.view = QTableView()
        self.view.setModel(self.model)
        self.view.verticalHeader().setVisible(False)
        self.view.horizontalHeader().setStretchLastSection(True)
        self.view.setShowGrid(False)
        self.view.setSelectionMode(QAbstractItemView.SingleSelection)
        self.view.setSelectionBehavior(QAbstractItemView.SelectRows)
        if selected is not None:
            self.view.selectRow(selected)
        self.view.setSortingEnabled(True)
        self.view.sortByColumn(0, Qt.AscendingOrder)

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.view)
        hbox = QHBoxLayout()
        self._effective_srate = QCheckBox("Use effective sampling rate")
        self._effective_srate.setChecked(True)
        hbox.addWidget(self._effective_srate)
        self._prefix_markers = QCheckBox("Prefix markers with stream ID")
        self._prefix_markers.setChecked(False)
        if not disabled:
            self._prefix_markers.setEnabled(False)
        hbox.addWidget(self._prefix_markers)
        vbox.addLayout(hbox)
        self.buttonbox = QDialogButtonBox(QDialogButtonBox.Ok
                                          | QDialogButtonBox.Cancel)
        vbox.addWidget(self.buttonbox)
        self.buttonbox.accepted.connect(self.accept)
        self.buttonbox.rejected.connect(self.reject)

        self.resize(775, 650)
        self.view.setColumnWidth(0, 90)
        self.view.setColumnWidth(1, 200)
        self.view.setColumnWidth(2, 140)
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
示例#14
0
    def __init__(self,
                 id,
                 name,
                 translated='',
                 rotated='',
                 scaled='',
                 label_count='',
                 training_image_count='',
                 test_image_count=''):
        super().__init__(name)

        self._id = id
        self._name = name

        if id == -1:
            pass
        else:
            for name, count in [['Training', training_image_count],
                                ['Test', test_image_count]]:
                self.append_row([
                    QStandardItem(name),
                    QStandardItem(translated),
                    QStandardItem(rotated),
                    QStandardItem(scaled),
                    QStandardItem(label_count),
                    QStandardItem(count)
                ])
示例#15
0
    def update(self, klustr_dao):
        self.clear()
        self.set_horizontal_header_labels([
            'Name', 'Translation', 'Rotation', 'Scaling', 'Label count',
            'Image count'
        ])

        total_label_image_count = klustr_dao.total_label_image_count
        label_count = total_label_image_count[0][0]
        image_count = total_label_image_count[0][1]
        self.append_row([
            KlustRDatasetItem(-1, 'All available images'),
            QStandardItem('-'),
            QStandardItem('-'),
            QStandardItem('-'),
            QStandardItem(f'{label_count}'),
            QStandardItem(f'{image_count}')
        ])

        for dataset in klustr_dao.available_datasets:
            translated = 'true' if dataset[2] else 'false'
            rotated = 'true' if dataset[3] else 'false'
            scaled = 'true' if dataset[4] else 'false'
            label_count = f'{dataset[5]}'
            training_image_count = f'{dataset[6]}'
            test_image_count = f'{dataset[7]}'
            image_count = f'{dataset[8]}'
            self.append_row([
                KlustRDatasetItem(dataset[0], dataset[1], translated, rotated,
                                  scaled, label_count, training_image_count,
                                  test_image_count),
                QStandardItem(translated),
                QStandardItem(rotated),
                QStandardItem(scaled),
                QStandardItem(label_count),
                QStandardItem(image_count)
            ])
    def create_itemview_tabwidget(self):
        result = QTabWidget()
        init_widget(result, "bottomLeftTabWidget")
        result.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Ignored)

        tree_view = QTreeView()
        init_widget(tree_view, "treeView")
        filesystem_model = QFileSystemModel(tree_view)
        filesystem_model.setRootPath(QDir.rootPath())
        tree_view.setModel(filesystem_model)

        table_widget = QTableWidget()
        init_widget(table_widget, "tableWidget")
        table_widget.setRowCount(10)
        table_widget.setColumnCount(10)

        list_model = QStandardItemModel(0, 1, result)

        list_model.appendRow(QStandardItem(QIcon(DIR_OPEN_ICON), "Directory"))
        list_model.appendRow(QStandardItem(QIcon(COMPUTER_ICON), "Computer"))

        list_view = QListView()
        init_widget(list_view, "listView")
        list_view.setModel(list_model)

        icon_mode_listview = QListView()
        init_widget(icon_mode_listview, "iconModeListView")

        icon_mode_listview.setViewMode(QListView.IconMode)
        icon_mode_listview.setModel(list_model)

        result.addTab(embed_into_hbox_layout(tree_view), "Tree View")
        result.addTab(embed_into_hbox_layout(table_widget), "Table")
        result.addTab(embed_into_hbox_layout(list_view), "List")
        result.addTab(embed_into_hbox_layout(icon_mode_listview),
                      "Icon Mode List")
        return result
示例#17
0
    def add_func_node(self, parent, pattern_col_item, func):
        self.hrefs_to_funcs[self.generate_href(func)] = func
        self.func_node_items[func] = pattern_col_item

        if not func.callees: func.callees = {}
        callees_text = '<br />'.join([
            str(k) + ': ' + self.get_func_name(v)
            for k, v in func.callees.items()
        ])
        callees_item = QStandardItem(callees_text)
        cols = [
            pattern_col_item,
            QStandardItem(func.name), callees_item,
            QStandardItem(str(func.pattern_offset) if func.pattern else ''),
            QStandardItem(str(func.pattern) if func.pattern else ''),
            QStandardItem(func.source_binary),
            QStandardItem(self.generate_href(func))
        ]
        boldface = cols[1].font()
        boldface.setBold(True)
        cols[1].setFont(boldface)
        parent.appendRow(cols)
示例#18
0
    def __init__(self, arg=None):
        super(Table, self).__init__(arg)
        # 设置窗体的标题和初始大小
        self.setWindowTitle("QTableView表格视图控件的例子")
        self.resize(500, 300)

        # 准备数据模型,设置数据层次结构为5行4列
        self.model = QStandardItemModel(5, 4)
        # 设置数据栏名称
        self.model.setHorizontalHeaderLabels(['标题1', '标题2', '标题3', '标题4'])

        for row in range(5):
            for column in range(4):
                item = QStandardItem("row %s, column %s" % (row, column))
                self.model.setItem(row, column, item)

        # 实例化表格视图,设置模型为自定义的模型
        self.tableView = QTableView()
        self.tableView.setModel(self.model)

        # 下面代码让表格 100% 的填满窗口
        self.tableView.horizontalHeader().setStretchLastSection(True)
        self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)

        # 下面代码让表格禁止编辑
        self.tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)

        # 下面代码让表格设置选中背景色
        self.tableView.setStyleSheet("selection-background-color:lightblue;")

        # 下面代码要限定只能选择整行
        # self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)  # 设置只能选中整行
        # self.tableView.setSelectionMode(QAbstractItemView.SingleSelection)  # 设置只能选中一行

        # 下面代码可以选中表格的多行
        self.tableView.setSelectionBehavior(QAbstractItemView.SelectRows)  # 设置只能选中整行
        self.tableView.setSelectionMode(QAbstractItemView.ExtendedSelection)  # 设置只能选中多行

        # 下面代码可以打印表格的1行2列数据
        data = self.tableView.model().index(1, 2).data()
        print(data)

        # 下面代码去掉左边表格的行号
        # headerView  = self.tableView.verticalHeader()
        # headerView.setHidden(True)

        # 局部布局
        vboxLayout = QVBoxLayout()
        vboxLayout.addWidget(self.tableView)
        self.add_btn = QPushButton("添加记录")
        # 连接信号槽,点击按钮 add_btn 绑定槽事件
        self.add_btn.clicked.connect(self.add_records_btn_click)

        self.del_btn = QPushButton("删除多行记录")
        # 连接信号槽,点击按钮 del_btn 绑定槽事件
        self.del_btn.clicked.connect(self.del_records_btn_click)
        # 局部布局
        hboxLayout = QHBoxLayout()
        hboxLayout.addWidget(self.add_btn)
        hboxLayout.addWidget(self.del_btn)

        # 全局布局
        wl = QVBoxLayout(self)
        wl.addLayout(vboxLayout)
        wl.addLayout(hboxLayout)
示例#19
0
def _add_item(item):
    tmp = QStandardItem()
    tmp.setData(item, Qt.DisplayRole)
    return tmp
示例#20
0
def _create_folder_item(title):
    result = QStandardItem(title)
    result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
    return result
示例#21
0
 def make_item(self, key):
     item = QStandardItem(key.name)
     item.setData(key)
     #item.setIcon(QIcon(qta.icon('fa5s.key', color=icon_color)))
     self.update_key_icon(item)
     return item
示例#22
0
    def refresh_images(self):
        self.image_list_model.clear()

        for path in list(self.image_atlas_set):
            item = QStandardItem(os.path.basename(path))
            self.image_list_model.appendRow(item)
            child.appendRow(add_child(num_children, nesting_level - 1))
        result.append(child)
    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)
示例#24
0
    def populateModel(self):

        self.model = QStandardItemModel()
        self.model.setHorizontalHeaderLabels([
            'Status', 'Directory / Filename', 'File Count', 'Size', 'Checksum',
            'Last Verified'
        ])
        rootItem = self.model.invisibleRootItem()

        for checksum_set in self.checksum_sets:
            last_verified = ''
            status = ''
            if not checksum_set.hasSha512File():
                status = 'New'
            elif checksum_set.has_changes():
                status = "Modified"
                self.toast_notification("Checksum set was modified.",
                                        checksum_set.baseDirname)
            else:
                time_delta = datetime.now(
                ) - checksum_set.sha512File.last_verified
                last_verified = f'{time_delta.days} days ago'
                if time_delta.days > good_days:
                    status = 'Test'
                else:
                    status = 'Good'

            if status == 'Test' or status == 'New' or status == 'Modified':
                item = [
                    QStandardItem(status),
                    QStandardItem(checksum_set.baseDirname),
                    QStandardItem(str(len(checksum_set.filenames))),
                    QStandardItem(''),
                    QStandardItem(''),
                    QStandardItem(last_verified)
                ]
                for filename in checksum_set.filenames:
                    checksum_text = ''
                    file_status = ''
                    if checksum_set.sha512File:
                        checksum = checksum_set.sha512File.findChecksum(
                            filename)
                        if checksum:
                            checksum_text = checksum
                        else:
                            file_status = 'Added'
                    size = Path(checksum_set.baseDirname +
                                filename).stat().st_size
                    size_display = self.format_size(size)
                    #     sz = len(checksum_set.baseDirname) + len(filename)
                    c_item = [
                        QStandardItem(file_status),
                        QStandardItem(filename),
                        QStandardItem(''),
                        QStandardItem(size_display),
                        QStandardItem(checksum_text)
                    ]
                    c_item[1].setData(checksum_set, QtCore.Qt.UserRole)
                    if file_status == 'Added':
                        c_item[0].setIcon(self.added_icon)
                    if filename == 'Thumbs.db':
                        c_item[0].setIcon(self.warning_icon)
                    item[0].appendRow(c_item)
                if checksum_set.hasSha512File():
                    for filename in checksum_set.get_missing_from_dir():
                        checksum_text = checksum_set.sha512File.findChecksum(
                            filename)
                        c_item = [
                            QStandardItem('Missing'),
                            QStandardItem(filename),
                            QStandardItem(''),
                            QStandardItem('n/a'),
                            QStandardItem(checksum_text)
                        ]
                        c_item[1].setData(checksum_set, QtCore.Qt.UserRole)
                        c_item[0].setIcon(self.missing_icon)
                        item[0].appendRow(c_item)
                rootItem.appendRow(item)
示例#25
0

if __name__ == '__main__':
    app = QApplication(sys.argv)

    view = GraphicsView()
    rowController = MyRowController()
    view.setReadOnly(True)
    view.setRowController(rowController)
    view.show()

    model = MyStandardItemModel()
    for i in range(0, 10):
        items = []
        for j in range(0, 10):
            item = QStandardItem()
            item.setText("Item " + str(i))
            item.setData(2, KDGantt.ItemTypeRole)
            item.setData(
                QDateTime.currentDateTime().addDays(2 * j).addMSecs(
                    100000 * i), KDGantt.StartTimeRole)
            item.setData(
                QDateTime.currentDateTime().addDays(2 * j + 1).addMSecs(
                    100000 * i), KDGantt.EndTimeRole)
            item.setData(random_alignment(), Qt.TextAlignmentRole)
            item.setData(random_position(), KDGantt.TextPositionRole)
            item.setFlags(item.flags() & ~Qt.ItemIsSelectable)
            items.append(item)
        model.appendRow(items)

    rowController.setModel(model)