def _slot_context_menu(self, point): context_menu = MMenu(parent=self) logical_column = self.logicalIndexAt(point) model = utils.real_model(self.model()) if logical_column >= 0 and model.header_list[logical_column].get('checkable', False): action_select_all = context_menu.addAction(self.tr('Select All')) action_select_none = context_menu.addAction(self.tr('Select None')) action_select_invert = context_menu.addAction(self.tr('Select Invert')) self.connect(action_select_all, SIGNAL('triggered()'), functools.partial(self._slot_set_select, logical_column, Qt.Checked)) self.connect(action_select_none, SIGNAL('triggered()'), functools.partial(self._slot_set_select, logical_column, Qt.Unchecked)) self.connect(action_select_invert, SIGNAL('triggered()'), functools.partial(self._slot_set_select, logical_column, None)) context_menu.addSeparator() fit_action = context_menu.addAction(self.tr('Fit Size')) fit_action.triggered.connect(functools.partial(self._slot_set_resize_mode, True)) context_menu.addSeparator() for column in range(self.count()): action = context_menu.addAction(model.headerData(column, Qt.Horizontal, Qt.DisplayRole)) action.setCheckable(True) action.setChecked(not self.isSectionHidden(column)) action.toggled.connect(functools.partial(self._slot_set_section_visible, column)) context_menu.exec_(QCursor.pos() + QPoint(10, 10))
def paintEvent(self, event): """Override paintEvent when there is no data to show, draw the preset picture and text.""" model = utils.real_model(self.model()) if model is None: draw_empty_content(self.viewport(), self._no_data_text, self._no_date_image) elif isinstance(model, MTableModel): if not model.get_data_list(): draw_empty_content(self.viewport(), self._no_data_text, self._no_date_image) return super(MListView, self).paintEvent(event)
def mouse_move_event(self, event): index = self.indexAt(event.pos()) real_index = utils.real_index(index) if self.header_list[real_index.column()].get('is_link', False): key_name = self.header_list[real_index.column()]['attr'] data_obj = utils.real_model(self.model()).data_list[real_index.row()] value = utils.get_obj_value(data_obj, key_name) if value: self.setCursor(Qt.PointingHandCursor) return self.setCursor(Qt.ArrowCursor)
def createEditor(self, parent, option, index): self.parent_widget = parent self.editor = MMenu(exclusive=self.exclusive, parent=parent) self.editor.setWindowFlags(Qt.FramelessWindowHint | Qt.Window) model = utils.real_model(index) real_index = utils.real_index(index) data_obj = real_index.internalPointer() attr = '{}_list'.format(model.header_list[real_index.column()].get('key')) self.editor.set_data(utils.get_obj_value(data_obj, attr, [])) self.editor.sig_value_changed.connect(self._slot_finish_edit) return self.editor
def _slot_set_select(self, column, state): current_model = self.model() source_model = utils.real_model(current_model) source_model.beginResetModel() attr = '{}_checked'.format(source_model.header_list[column].get('key')) for row in range(current_model.rowCount()): real_index = utils.real_index(current_model.index(row, column)) data_obj = real_index.internalPointer() if state is None: old_state = utils.get_obj_value(data_obj, attr) utils.set_obj_value(data_obj, attr, Qt.Unchecked if old_state == Qt.Checked else Qt.Checked) else: utils.set_obj_value(data_obj, attr, state) source_model.endResetModel() source_model.emit(SIGNAL('dataChanged(QModelIndex, QModelIndex)'), None, None)
def test_with_standard_item_model(): """Test when source model is QStandardItemModel""" source_model = QtGui.QStandardItemModel(2, 2) sort_filter_model_1 = QtCore.QSortFilterProxyModel() sort_filter_model_1.setSourceModel(source_model) sort_filter_model_2 = QtCore.QSortFilterProxyModel() sort_filter_model_2.setSourceModel(source_model) index_1 = source_model.index(0, 0) index_2 = source_model.index(1, 1) index_3 = sort_filter_model_1.index(0, 1) index_4 = sort_filter_model_1.index(1, 1) index_5 = sort_filter_model_2.index(1, 0) index_6 = sort_filter_model_2.index(1, 1) assert utils.real_model(source_model) is source_model assert utils.real_model(sort_filter_model_1) is source_model assert utils.real_model(sort_filter_model_2) is source_model assert utils.real_model(index_1) is source_model assert utils.real_model(index_2) is source_model assert utils.real_model(index_3) is source_model assert utils.real_model(index_4) is source_model assert utils.real_model(index_5) is source_model assert utils.real_model(index_6) is source_model
def test_with_string_list_model(): """Test when source model is QStringListModel""" source_model = QtCore.QStringListModel(["apple", "pear", "orange"]) sort_filter_model_1 = QtCore.QSortFilterProxyModel() sort_filter_model_1.setSourceModel(source_model) sort_filter_model_2 = QtCore.QSortFilterProxyModel() sort_filter_model_2.setSourceModel(source_model) index_1 = source_model.index(0, 0) index_2 = source_model.index(1, 0) index_3 = sort_filter_model_1.index(0, 0) index_4 = sort_filter_model_1.index(1, 0) index_5 = sort_filter_model_2.index(1, 0) index_6 = sort_filter_model_2.index(1, 0) assert utils.real_model(source_model) is source_model assert utils.real_model(sort_filter_model_1) is source_model assert utils.real_model(sort_filter_model_2) is source_model assert utils.real_model(index_1) is source_model assert utils.real_model(index_2) is source_model assert utils.real_model(index_3) is source_model assert utils.real_model(index_4) is source_model assert utils.real_model(index_5) is source_model assert utils.real_model(index_6) is source_model
def mouse_release_event(self, event): if event.button() != Qt.LeftButton: QTableView.mouseReleaseEvent(self, event) return index = self.indexAt(event.pos()) real_index = utils.real_index(index) if self.headerList[real_index.column()].get('is_link', False): key_name = self.header_list[real_index.column()]['attr'] data_obj = utils.real_model(self.model()).data_list[real_index.row()] value = utils.get_obj_value(data_obj, key_name) if value: if isinstance(value, dict): self.sig_link_clicked.emit(value) elif isinstance(value, six.string_types): self.sig_link_clicked.emit(data_obj) elif isinstance(value, list): for i in value: self.sig_link_clicked.emit(i)