class ReferenceDataDlg(QDialog): def __init__(self, table, title, parent=None): super(ReferenceDataDlg, self).__init__(parent) self.create_widgets(table) self.layout_widgets() self.create_connections() self.setWindowTitle( "Asset Manager - Edit {0} Reference Data".format(title)) def create_widgets(self, table): self.model = QSqlTableModel(self) self.model.setTable(table) self.model.setSort(NAME, Qt.AscendingOrder) self.model.setHeaderData(ID, Qt.Horizontal, QVariant("ID")) self.model.setHeaderData(NAME, Qt.Horizontal, QVariant("Name")) self.model.setHeaderData(DESCRIPTION, Qt.Horizontal, QVariant("Description")) self.model.select() self.view = QTableView() self.view.setModel(self.model) self.view.setSelectionMode(QTableView.SingleSelection) self.view.setSelectionBehavior(QTableView.SelectRows) self.view.setColumnHidden(ID, True) self.view.resizeColumnsToContents() self.addButton = QPushButton("&Add") self.deleteButton = QPushButton("&Delete") self.okButton = QPushButton("&OK") def layout_widgets(self): buttonLayout = QHBoxLayout() buttonLayout.addWidget(self.addButton) buttonLayout.addWidget(self.deleteButton) buttonLayout.addStretch() buttonLayout.addWidget(self.okButton) layout = QVBoxLayout() layout.addWidget(self.view) layout.addLayout(buttonLayout) self.setLayout(layout) def create_connections(self): self.addButton.clicked.connect(self.addRecord) self.deleteButton.clicked.connect(self.deleteRecord) self.okButton.clicked.connect(self.accept) def addRecord(self): row = self.model.rowCount() self.model.insertRow(row) index = self.model.index(row, NAME) self.view.setCurrentIndex(index) self.view.edit(index) def deleteRecord(self): index = self.view.currentIndex() if not index.isValid(): return record = self.model.record(index.row()) id = record.value(ID).toInt()[0] table = self.model.tableName() query = QSqlQuery() if table == "deps": query.exec_(QString("SELECT COUNT(*) FROM employee " "WHERE deo_id = %1").arg(id)) elif table == "cities": query.exec_(QString("SELECT COUNT(*) FROM employee " "WHERE city_id = %1").arg(id)) count = 0 if query.next(): count = query.value(0).toInt()[0] if count: QMessageBox.information(self, QString("Delete %1").arg(table), (QString("Cannot delete %1<br>" "from the %2 table because it is used by " "%3 records") .arg(record.value(NAME).toString()) .arg(table).arg(count))) return self.model.removeRow(index.row()) self.model.submitAll()
class StaffDataDlg(QDialog): def __init__(self, parent=None): super(StaffDataDlg, self).__init__(parent) self.create_widgets() self.layout_widgets() self.create_connections() self.setMinimumWidth(850) self.setWindowTitle(u'Список сотрудников компании') def create_widgets(self): self.model = QtSql.QSqlRelationalTableModel(self) self.model.setTable("employee") self.model.setEditStrategy(QtSql.QSqlTableModel.OnManualSubmit) self.model.setRelation(CITY, QtSql.QSqlRelation('cities', 'city_id', 'name')) self.model.setRelation(DEPARTMENT, QtSql.QSqlRelation('deps', 'dep_id', 'name')) self.model.setSort(ID, Qt.AscendingOrder) self.model.setHeaderData(ID, Qt.Horizontal, QVariant("ID")) self.model.setHeaderData(CITY, Qt.Horizontal, QVariant("City")) self.model.setHeaderData(DEPARTMENT, Qt.Horizontal, QVariant("Department")) self.model.setHeaderData(FIRSTNAME, Qt.Horizontal, QVariant("First Name")) self.model.setHeaderData(LASTNAME, Qt.Horizontal, QVariant("Last Name")) self.model.setHeaderData(SEX, Qt.Horizontal, QVariant("sex")) self.model.setHeaderData(ADDRESS, Qt.Horizontal, QVariant("Address")) self.model.setHeaderData(PID, Qt.Horizontal, QVariant("PID")) self.model.setHeaderData(TITLE, Qt.Horizontal, QVariant("Title")) self.model.setHeaderData(SOLARY, Qt.Horizontal, QVariant("SOLARY")) self.model.setHeaderData(SHIFT, Qt.Horizontal, QVariant("SHIFT")) self.model.setHeaderData(HOURS, Qt.Horizontal, QVariant("HOURS")) self.model.select() self.view = QTableView() self.view.setModel(self.model) self.view.setItemDelegate(QtSql.QSqlRelationalDelegate(self)) self.view.setColumnHidden(ID, True) self.view.resizeColumnsToContents() self.buttonBox = QDialogButtonBox() self.addCity = self.buttonBox.addButton(u"&Добавить City", QDialogButtonBox.ActionRole) self.addDep = self.buttonBox.addButton(u"&Добавить Department", QDialogButtonBox.ActionRole) self.addButton = self.buttonBox.addButton(u"&Добавить", QDialogButtonBox.ActionRole) self.deleteButton = self.buttonBox.addButton(u"&Удалить", QDialogButtonBox.ActionRole) self.sortButton = self.buttonBox.addButton(u"&Сортировать", QDialogButtonBox.ActionRole) menu = QMenu(self) self.sortByTitleAction = menu.addAction(u"Сортировка по &Title") self.sortBySolaryAction = menu.addAction( u"Сортировка по &SOLARY") self.sortByIDAction = menu.addAction(u"Сортировка по &ID") self.sortButton.setMenu(menu) self.closeButton = self.buttonBox.addButton(QDialogButtonBox.Close) def layout_widgets(self): layout = QVBoxLayout() layout.addWidget(self.view) layout.addWidget(self.buttonBox) self.setLayout(layout) def create_connections(self): self.addButton.clicked.connect(self.addRecord) self.deleteButton.clicked.connect(self.deleteRecord) self.addCity.clicked.connect(self.editCities) self.sortByTitleAction.triggered.connect( lambda: self.sort(TITLE)) self.sortBySolaryAction.triggered.connect( lambda: self.sort(SOLARY)) self.sortByIDAction.triggered.connect(lambda: self.sort(ID)) self.closeButton.clicked.connect(self.accept) def addRecord(self): row = self.model.rowCount() self.model.insertRow(row) index = self.model.index(row, TITLE) self.view.setCurrentIndex(index) self.view.edit(index) def deleteRecord(self): index = self.view.currentIndex() if not index.isValid(): return record = self.model.record(index.row()) title = record.value(TITLE).toString() desc = record.value(SOLARY).toString() if (QMessageBox.question(self, "Reference Data", QString("Delete %1 from title %2?") .arg(desc).arg(title), QMessageBox.Yes|QMessageBox.No) == QMessageBox.No): return self.model.removeRow(index.row()) self.model.submitAll() def sort(self, column): self.model.setSort(column, Qt.AscendingOrder) self.model.select() def editCities(self): form = ReferenceDataDlg("cities", "Cities", self) form.exec_()
class DataDialog(QDialog): def __init__(self, name, table, parent=None): super(DataDialog, self).__init__(parent) self.name = name self.resize(600, 300) self.model = QSqlTableModel(self) self.model.setTable(table) self.model.setSort(ID, Qt.AscendingOrder) self.model.setHeaderData(ID, Qt.Horizontal, QVariant(_("Id"))) self.model.setHeaderData(EMAIL, Qt.Horizontal, QVariant(_("Email"))) self.model.setHeaderData(WWW, Qt.Horizontal, QVariant(_("WWW"))) self.model.setHeaderData(PACKAGE, Qt.Horizontal, QVariant(_("Package"))) self.model.select() self.view = QTableView() self.view.setModel(self.model) self.view.setSelectionMode(QTableView.SingleSelection) self.view.setSelectionBehavior(QTableView.SelectRows) # self.view.setColumnHidden(ID, True) # self.view.resizeColumnsToContents() addButton = QPushButton(_("&Add")) addButton.setIcon(QIcon(":/add.png")) deleteButton = QPushButton(_("&Delete")) deleteButton.setIcon(QIcon(":/delete.png")) okButton = QPushButton(_("&OK")) okButton.setIcon(QIcon(":/quit.png")) addButton.setFocusPolicy(Qt.NoFocus) deleteButton.setFocusPolicy(Qt.NoFocus) buttonLayout = QHBoxLayout() buttonLayout.addWidget(addButton) buttonLayout.addWidget(deleteButton) buttonLayout.addStretch() buttonLayout.addWidget(okButton) layout = QVBoxLayout() layout.addWidget(self.view) layout.addLayout(buttonLayout) self.setLayout(layout) self.connect(addButton, SIGNAL("clicked()"), self.addRecord) self.connect(deleteButton, SIGNAL("clicked()"), self.deleteRecord) self.connect(okButton, SIGNAL("clicked()"), self.accept) self.setWindowTitle(name) def addRecord(self): row = self.model.rowCount() self.model.insertRow(row) index = self.model.index(row, EMAIL) self.view.setCurrentIndex(index) self.view.edit(index) def deleteRecord(self): index = self.view.currentIndex() if not index.isValid(): return self.model.removeRow(index.row()) self.model.submitAll() def accept(self): QDialog.accept(self)
class I4CheckWindow(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setup_model() self.tableview = QTableView() self.tableview.setSelectionMode(QAbstractItemView.NoSelection) self.tableview.setEditTriggers(QAbstractItemView.DoubleClicked) self.cbdelegate = CheckBoxDelegate() self.tableview.setItemDelegate(self.cbdelegate) self.tableview.setAutoScroll(False) self.tableview.setModel(self.model) self.tableview.sortByColumn(0, Qt.AscendingOrder) self.adjust_headers() #self.model.setHeaderData(0, Qt.Horizontal, u"") #self.model.setHeaderData(1, Qt.Horizontal, u"Title") self.radio_all = QRadioButton("All") self.radio_all.setChecked(True) self.radio_need = QRadioButton("Need") self.connect(self.radio_all, SIGNAL("toggled(bool)"), self.set_show_all) label = QLabel("DB:") label.setFixedWidth(40) label.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) self.db_combo = QComboBox() self.populate_db_combo() self.connect( self.db_combo, SIGNAL("currentIndexChanged(int)"), self.db_index_changed) self.new_button = QPushButton("New") self.connect(self.new_button, SIGNAL("clicked()"), self.new_item) self.box = QVBoxLayout(self) self.box.addWidget(self.tableview) self.button_box = QHBoxLayout() self.button_box.setSpacing(0) self.button_box.addWidget(self.new_button) self.button_box.addWidget(self.radio_all) self.button_box.addWidget(self.radio_need) self.button_box.addWidget(label) self.button_box.addWidget(self.db_combo) self.box.addLayout(self.button_box) # self.setStyleSheet(""" # QComboBox { # font-size: 16px; # } # """) self.dwim_after_load() def dwim_after_load(self): if self.model.need_anything(): self.radio_need.setChecked(True) return self.radio_all.setChecked(True) if self.model.model.rowCount() == 0: edit_index = self.model.new() self.tableview.setCurrentIndex(edit_index) self.tableview.scrollTo(edit_index) self.tableview.edit(edit_index) def adjust_headers(self): log.debug("adjust_sizes()") self.tableview.horizontalHeader().setResizeMode(0, QHeaderView.Stretch) self.tableview.setColumnWidth(0, 1) self.tableview.verticalHeader().setDefaultSectionSize(ITEM_HEIGHT) self.tableview.verticalHeader().hide() self.tableview.horizontalHeader().hide() def setup_model(self): self.model = CheckListModel() def new_item(self): index = self.model.new() self.tableview.setCurrentIndex(index) self.tableview.resizeRowToContents(index.row()) self.tableview.scrollTo(index) self.tableview.edit(index) def set_show_all(self, show_all): if self.model.show_all == show_all: return self.model.set_show_all(show_all) self.tableview.resizeRowsToContents() def save(self): self.model.save() def checkout(self): if QMessageBox.question( self, "Checkout", "Are you sure you want to check out?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == \ QMessageBox.Yes: self.model.checkout() def reset_items(self): if QMessageBox.question( self, "Checkout", "Are you sure you want to reset the list?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == \ QMessageBox.Yes: self.model.reset_items() self.radio_all.setChecked(True) def delete_database(self): if QMessageBox.question( self, "Delete database", "Are you sure you want to delete the current database?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == \ QMessageBox.Yes: self.model.delete_database() self.populate_db_combo() self.dwim_after_load() _loading_db_combo = False def populate_db_combo(self): self._loading_db_combo = True try: self.db_combo.clear() for db_name in self.model.databases: self.db_combo.addItem(re.sub("\\.org$", "", db_name), db_name) self.db_combo.addItem("New database...", "") self.db_combo.setCurrentIndex( self.model.databases.index(self.model.current_db)) finally: self._loading_db_combo = False def db_index_changed(self, index): if self._loading_db_combo: return db_name = str(self.db_combo.itemData(index).toPyObject()) if db_name == self.model.current_db: return self.model.save() if db_name: self.model.load(db_name) self.dwim_after_load() return db_name, ok = QInputDialog.getText( self, "New Database", "Enter database name") if ok: if not re.match(r"^[\w-]+$", db_name): QMessageBox.critical( self, "Error", "Database name must contain only the following chars: " "A-Z a-z 0-9 _ -") ok = False elif db_name in self.model.databases: QMessageBox.critical( self, "Error", "Database '%s' already exists" % db_name) ok = False if not ok: self.db_combo.setCurrentIndex( self.model.databases.index(self.model.current_db)) return db_name = str(db_name) + ".org" self.model.load(db_name) self.populate_db_combo() self.dwim_after_load()
def edit(self, index, trigger, event): if trigger == QAbstractItemView.DoubleClicked: #print('DoubleClick Killed!') # Avoid that the double click trigger the renaming action return False return QTableView.edit(self, index, trigger, event)