class CtrlUserWidget(QDialog): def __init__(self, parent=None): QDialog.__init__(self, parent=parent) self.model = UsersListModel() self.model.update(db.load_users()) self.setModal(True) self.setWindowTitle('Users') self.initUI() def initUI(self): self.addBtn = QPushButton('Add user') self.addBtn.setIcon(QIcon('res/img/icons/plus_32.png')) self.editBtn = QPushButton('Edit user') self.editBtn.setIcon(QIcon('res/img/icons/edit_32.png')) self.editBtn.setDisabled(True) self.delBtn = QPushButton('Delete user') self.delBtn.setIcon(QIcon('res/img/icons/minus_32.png')) self.userView = QListView() self.userView.setEditTriggers(QAbstractItemView.NoEditTriggers) self.userView.setGeometry(0, 0, 100, 400) self.userView.setModel(self.model) self.buttons = QDialogButtonBox(QDialogButtonBox.Save, Qt.Horizontal, self) self.buttons.accepted.connect(self.accept) self.addBtn.clicked.connect(self.addUser) self.delBtn.clicked.connect(self.deleteUser) self.userView.doubleClicked.connect(self.activate_user) btnLayout = QVBoxLayout() btnLayout.addWidget(self.addBtn) btnLayout.addWidget(self.editBtn) btnLayout.addWidget(self.delBtn) upLayout = QHBoxLayout() upLayout.addWidget(self.userView) upLayout.addLayout(btnLayout) mainLayout = QVBoxLayout(self) mainLayout.addLayout(upLayout) mainLayout.addWidget(self.buttons) def showWidget(self, parent=None): dialog = CtrlUserWidget(parent) ok = dialog.exec_() return ok def addUser(self): dialog = AddUserDialog.getUser() if dialog: self.model.update(db.load_users()) self.model.layoutChanged.emit() self._update_view() return True def _update_view(self): self.userView.setModel(self.model) def deleteUser(self): indexes = self.userView.selectedIndexes() if indexes: # Indexes is a list of a single item in single-select mode. index = indexes[0] # Remove the item and refresh. db_response = db.del_user(self.model.data[index.row()][0]) if db_response: del self.model.data[index.row()] self.model.layoutChanged.emit() # Clear the selection (as it is no longer valid). self.userView.clearSelection() else: QMessageBox.warning( self, 'User is active', 'User is active. Change active User before delete', QMessageBox.Ok) def activate_user(self): indexes = self.userView.selectedIndexes() if indexes: # Indexes is a list of a single item in single-select mode. index = indexes[0] # Remove the item and refresh. db.set_active_user(self.model.data[index.row()][0]) self.model.update(db.load_users()) self.model.layoutChanged.emit() return True
class MyListWithModel(QGroupBox): def __init__(self): super().__init__() self.setTitle('MyListWithModel') self.init_ui() def init_ui(self): self.listview = QListView() self.model = DataModel(data=[('my first todo'), ('my second todo')]) self.listview.setModel(self.model) self.listview.setSelectionMode(QListView.MultiSelection) # add Layout layout_add = QHBoxLayout() self.line_add_edit = QLineEdit('Add Item') add_btn = QPushButton('add') layout_add.addWidget(self.line_add_edit) layout_add.addWidget(add_btn) # insert to position layout layout_insert = QHBoxLayout() self.line_insert_position_edit = QLineEdit('Insert Item') self.spinbox_pos = QSpinBox() self.spinbox_pos.setRange(0, self.model.rowCount()) # list항목이 추가되면 max도 변경되도록 추가할 것 insert_btn = QPushButton('Insert') layout_insert.addWidget(self.line_insert_position_edit) layout_insert.addWidget(self.spinbox_pos) layout_insert.addWidget(insert_btn) print_btn = QPushButton('Print') print_multi_btn = QPushButton('Print Multi') remove_btn = QPushButton('Current Item Remove') clear_btn = QPushButton('Clear') # connect add_btn.clicked.connect(self.add_item) insert_btn.clicked.connect(self.insert_pos_item) print_btn.clicked.connect(lambda: print(self.model.data[self.listview.selectedIndexes()[0].row()])) print_multi_btn.clicked.connect(self.print_multi_items) remove_btn.clicked.connect(self.remove_current_item) clear_btn.clicked.connect(self.clear_listview) layout_btns = QHBoxLayout() layout_btns.addWidget(print_btn) layout_btns.addWidget(print_multi_btn) layout_btns.addWidget(remove_btn) layout_btns.addWidget(clear_btn) layout = QVBoxLayout() layout.addWidget(self.listview) layout.addLayout(layout_add) layout.addLayout(layout_insert) layout.addLayout(layout_btns) self.setLayout(layout) def add_item(self): item = self.line_add_edit.text() if item: self.model.data.append(item) self.model.layoutChanged.emit() def insert_pos_item(self): item = self.line_insert_position_edit.text() row = self.spinbox_pos.value() if item: self.model.data.insert(row, item) self.spinbox_pos.setMaximum(len(self.model.data)) self.model.layoutChanged.emit() def remove_current_item(self): indexes = self.listview.selectedIndexes() if indexes: index = indexes[0] del self.model.data[index.row()] self.model.layoutChanged.emit() self.listview.clearSelection() def print_multi_items(self): indexes = self.listview.selectedIndexes() print(type(indexes)) for i in indexes: print(self.model.data[i.row()]) def clear_listview(self): self.model.data = [] self.model.layoutChanged.emit()