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)), ])
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)
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 __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 _task_item_changed(self, item: QtGui.QStandardItem, task: Task, column: Column) -> None: if column == Column.Name: new_name = item.data(QtCore.Qt.DisplayRole) self.rename_task_requested.emit(task, new_name) elif column == Column.Due: due = item.data(QtCore.Qt.DisplayRole) self.schedule_task_requested.emit(task, _qdate_to_date(due)) elif column == Column.Snoozed: snoozed = item.data(QtCore.Qt.DisplayRole) self.snooze_task_requested.emit(task, _qdate_to_date(snoozed))
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
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)
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)
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
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)
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)
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)
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) ])
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
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 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)
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)
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)
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)
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)
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)
def _create_folder_item(title): result = QStandardItem(title) result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) return result
def getChildrenFromStandardItem(item: QStandardItem): for i in range(item.rowCount()): yield item.child(i)
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)
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
def _add_item(item): tmp = QStandardItem() tmp.setData(item, Qt.DisplayRole) return tmp
def item_changed(self, task_list: TasksView, item: QtGui.QStandardItem) -> None: task = item.data(TASK_ROLE) column = task_list.columns()[item.column()] self._task_item_changed(item, task, column)