コード例 #1
0
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
コード例 #2
0
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()