def setupTable(self, data_model, query_cmdline): """Set up the main window. The SQL model used is based on data_model; The query_cmdline argument is a list of queries from the command line.""" if data_model == "read-write": # Create the model instance self.model = QSqlTableModel() # Populate the model with data. Example of using setQuery() to display data in the # table view; you would typically use setTable() to populate the model for qry in query_cmdline: query = QSqlQuery(qry) self.model.setQuery(query) elif data_model == "read-only": self.model = QSqlQueryModel() # Populate the model with data for qry in query_cmdline: self.model.setQuery(qry) table_view = QTableView() table_view.setModel(self.model) table_view.hideColumn( 0) # Useful if you don't want to view the id values table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.setCentralWidget(table_view)
def __init__(self, data_list, header, *args): QWidget.__init__( self, *args, ) self.setGeometry(10, 50, 1900, 900) self.setWindowTitle('Loonbetalingen opvragen') self.setWindowIcon(QIcon('./images/logos/logo.jpg')) self.setWindowFlags(self.windowFlags() | Qt.WindowSystemMenuHint | Qt.WindowMinMaxButtonsHint) table_model = MyTableModel(self, data_list, header) table_view = QTableView() table_view.setModel(table_model) table_view.resizeColumnsToContents() table_view.setSelectionBehavior(QTableView.SelectRows) font = QFont("Arial", 10) table_view.setFont(font) table_view.hideColumn(3) table_view.hideColumn(36) table_view.hideColumn(37) #table_view.clicked.connect(selectRow) table_view.clicked.connect(showSelection) layout = QVBoxLayout(self) layout.addWidget(table_view) self.setLayout(layout)
def search_button_onclicked(self, keyword: str, search_table: QtWidgets.QTableView): scrape = YTScrape(keyword) result = scrape.scrape() model = TableModel(result) search_table.setModel(model) search_table.hideColumn(1) search_table.resizeColumnsToContents()
class CustomNetworkView(ApplicationTableView): def __init__(self, parent): self.view = QTableView() self.parent = parent self.cnmodel = models.CustomNetwork(self.parent.connection) self.view.setModel(self.cnmodel.getModel()) self.view.setItemDelegate(QSqlRelationalDelegate(self.view)) self.view.selectionModel().selectionChanged.connect(self.selChanged) self.view.doubleClicked.connect(self.manageDoubleClick) self._formatTable() self.dependantView = parent.cncview self.customnetwork_id = -1 super().__init__(self.view) def _formatTable(self): super()._formatTable() self.view.hideColumn(0) def manageDoubleClick(self): log.debug("doubleClick detected") def selChanged(self, event, selected): indexes = event.indexes() self.parent.deletebutton.setEnabled(True) self.parent.editbutton.setEnabled(True) if indexes: index = indexes[0] rowidx = index.row() self.view.selectRow(rowidx) cn_id = self.cnmodel.getModel().index(rowidx, 0).data() cn_name = self.cnmodel.getModel().index(rowidx, 1).data() self.parent.connection.open() dependant_model = self.dependantView.cnmodel.getModel() dependant_model.setFilter("customnetwork_id={}".format(cn_id)) self.parent.connection.close() self.customnetwork_id = cn_id self.parent.parent.customnetwork_id = cn_id self.parent.parent.calculateNetworkAction.setEnabled(True) def remove(self): reply = QMessageBox.question(self.parent, 'Delete custom network', "Are you sure to remove?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: log.debug("The {} customnetwork is going to be deleted" .format(self.customnetwork_id)) ok = self.parent.cncview.cnmodel.\ delete_cnc(self.customnetwork_id) if ok: self.cnmodel.delete_cn(self.customnetwork_id) def get_selected_custom_network(self): return self.customnetwork_id
def createView(self, title, model): self.model = model self.title = title view = QTableView(self) view.setModel(self.model) view.setWindowTitle(self.title) view.resizeColumnsToContents() view.setGeometry(25, 25, 380, 200) view.hideColumn(0) view.setItemDelegate(QSqlRelationalDelegate(view)) return view
def _makeTable(self, model): table = QTableView(self) table.setModel(model) table.hideColumn(0) table.setShowGrid(False) subListDelegate = SubListItemDelegate() table.setItemDelegateForColumn(1, subListDelegate) table.setItemDelegateForColumn(2, subListDelegate) table.horizontalHeader().setSectionResizeMode(3, QHeaderView.Stretch) table.horizontalHeader().setSectionResizeMode(4, QHeaderView.ResizeToContents) return table
class transactionTable(QWidget): def __init__(self, parent=None): super().__init__(parent) self.model = None self.transactionsTableView = QTableView() headerBox = QFrame() headerBox.setLayout(QHBoxLayout()) headerBox.layout().setContentsMargins(0, 0, 0, 0) headerBox.layout().addWidget(QLabel("Transactions")) newTransactionButton = QPushButton(QIcon.fromTheme("list-add"), '', self) newTransactionButton.setFixedSize(20, 20) newTransactionButton.clicked.connect(self.addEntry) delTransactionButton = QPushButton(QIcon.fromTheme("list-remove"), '', self) delTransactionButton.setFixedSize(20, 20) delTransactionButton.clicked.connect(self.removeEntry) headerBox.layout().addWidget(newTransactionButton) headerBox.layout().addWidget(delTransactionButton) headerBox.layout().addStretch() boxLayout = QVBoxLayout(self) boxLayout.addWidget(headerBox) boxLayout.addWidget(self.transactionsTableView) def setModel(self, model): self.model = model self.transactionsTableView.setModel(self.model) self.transactionsTableView.hideColumn(0) self.transactionsTableView.hideColumn(1) @pyqtSlot() def addEntry(self): self.model.insertRow(self.model.rowCount()) folioIndex = self.model.createIndex( self.model.rowCount() - 1, self.model.fieldIndex("Folio Number")) self.model.setData(folioIndex, self.model.folioNumber) self.transactionsTableView.selectRow(self.model.rowCount()) @pyqtSlot() def removeEntry(self): for idx in self.transactionsTableView.selectedIndexes(): assert (self.model.removeRow(idx.row()))
class FilterSelectionScreen(SelectionScreen): """ Shows all plans and tasks in a tree view """ def __init__(self, data_context): super(FilterSelectionScreen, self).__init__(data_context) self.table_model = TableModel() self.table_model.setSourceModel(self.data_context.data_model) self.tasks_model = TasksModel() self.tasks_model.setSourceModel(self.table_model) filter_widgets = QFormLayout() self.ancestor_filter = QLineEdit() self.ancestor_filter.textChanged.connect( self.tasks_model.task_matcher.ancestor_filter) filter_widgets.addRow(QLabel("Ancestor:"), self.ancestor_filter) self.text_filter = QLineEdit() self.text_filter.textChanged.connect( self.tasks_model.task_matcher.text_filter) filter_widgets.addRow(QLabel("Text:"), self.text_filter) result_model = QStringListModel(["", "open", "success", "nil"]) self.result_filter = QComboBox() self.result_filter.setModel(result_model) self.result_filter.currentTextChanged.connect( self.tasks_model.task_matcher.result_filter) filter_widgets.addRow(QLabel("Result:"), self.result_filter) self.table_view = QTableView() self.table_view.setModel(self.tasks_model) self.table_view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table_view.setSelectionBehavior(QAbstractItemView.SelectRows) self.table_view.verticalHeader().hide() self.table_view.horizontalHeader().setStretchLastSection(True) self.table_view.selectionModel().selectionChanged.connect( self.selection_changed) self.table_view.hideColumn(TreeModelCols.DESCRIPTION) self.table_view.hideColumn(TreeModelCols.RESULT) self.table_view.hideColumn(TreeModelCols.LINK) layout = QVBoxLayout() layout.addLayout(filter_widgets) layout.addWidget(self.table_view) self.setLayout(layout) def selection_changed(self, selected, _): """ Handle changed selection """ if len(selected.indexes()) < 1: return index = selected.indexes()[0] flat_index = self.tasks_model.mapToSource(index) tree_index = self.table_model.mapToSource(flat_index) self.item_selected.emit(tree_index) def clear_selection(self): """ Called when screen is being switched to """ self.table_view.selectionModel().clearSelection()
class EditWindow(QWidget): """ Controller class for theEdit window used to modify and delete identities. Attributes: model model for the SQL table containg the identities """ def __init__(self): """Class constructor that sets up the window layout and allocates attributes""" super().__init__() self.title = 'Database Manager - Edit' self.vLayout = QVBoxLayout() self.model = QSqlTableModel(self, db) self.model.setTable('faces') self.model.select() self.table = QTableView(self) self.table.setModel(self.model) self.table.hideColumn(0) self.table.hideColumn(7) self.deleteButton = QPushButton("Delete") self.deleteButton.clicked.connect(self.delete_row) self.vLayout.addWidget(self.table) self.vLayout.addWidget(self.deleteButton) self.setLayout(self.vLayout) self.setFixedSize(600,400) self.show() def delete_row(self): """Method to delete the current selected row (and relative identity from the database)""" idxs = self.table.selectionModel().selectedIndexes() if len(idxs) > 0: self.model.removeRows(idxs[0].row(), 1) self.model.select() def update_model(self): """Updates the model from the database""" self.model.select()
MODEL.setTable('vendors') MODEL.setSort(1, QtCore.Qt.AscendingOrder) MODEL.select() # Задаем заголовки для столбцов модели MODEL.setHeaderData(1, QtCore.Qt.Horizontal, 'Название') MODEL.setHeaderData(2, QtCore.Qt.Horizontal, 'Телефон') MODEL.setHeaderData(3, QtCore.Qt.Horizontal, 'Адрес') # Задаем для таблицы только что созданную модель VBOX_OBJ = QVBoxLayout() TV_OBJ = QTableView() TV_OBJ.setModel(MODEL) # Скрываем первый столбец, в котором выводится идентификатор TV_OBJ.hideColumn(0) TV_OBJ.setColumnWidth(1, 150) TV_OBJ.setColumnWidth(2, 60) TV_OBJ.setColumnWidth(3, 130) VBOX_OBJ.addWidget(TV_OBJ) BTN_ADD = QPushButton("&Добавить запись") BTN_ADD.clicked.connect(add_record) VBOX_OBJ.addWidget(BTN_ADD) BTN_DEL = QPushButton("&Удалить запись") BTN_DEL.clicked.connect(del_record) VBOX_OBJ.addWidget(BTN_DEL) W_OBJ.setLayout(VBOX_OBJ) W_OBJ.resize(400, 250)
class Services(QWidget): """ Klasa odpowiedzialna za widget usług """ def __init__(self, parent, db): super(QWidget, self).__init__(parent) self.parent = parent self.proxy = QSortFilterProxyModel(self) self.view = QTableView() self.txt_nazwa = QLineEdit() self.txt_cena = QLineEdit() self.txt_czas = QLineEdit() self.txt_opis = QTextEdit() self.btn_mod = QPushButton('Modyfikuj') self.btn_usun = QPushButton('Usuń') self.id_modify = -1 # Parametry połączenia z bazą self.model = QSqlTableModel(self, db) self.initUI() def initUI(self): """ Inicjuje UI """ self.table_init() self.btn_usun.setDisabled(True) self.btn_mod.setDisabled(True) self.txt_czas.setInputMask('99:00') # Tworzenie kontrolek lbl_wysz = QLabel("Wyszukaj zabieg:") txt_wysz = QLineEdit(self) btn_dodaj = QPushButton('Dodaj') lbl_nazwa = QLabel('Nazwa:') lbl_cena = QLabel('Cena:') lbl_czas = QLabel('Czas:') lbl_opis = QLabel('Opis:') # Tworzenie widoków centralbox = QHBoxLayout() findbox = QHBoxLayout() vbox = QVBoxLayout() groupbox = QGroupBox('Zabiegi') groupbox_layout = QVBoxLayout() button_hbox = QHBoxLayout() formbox = QFormLayout() # Metody self.view.clicked.connect(self.change) txt_wysz.textChanged.connect(self.searching) btn_dodaj.clicked.connect(self.add) self.btn_mod.clicked.connect(self.modify) self.btn_usun.clicked.connect(self.remove) # Ustawianie widoków findbox.addWidget(lbl_wysz) findbox.addWidget(txt_wysz) button_hbox.addWidget(btn_dodaj) button_hbox.addWidget(self.btn_mod) button_hbox.addWidget(self.btn_usun) formbox.addRow(lbl_nazwa, self.txt_nazwa) formbox.addRow(lbl_cena, self.txt_cena) formbox.addRow(lbl_czas, self.txt_czas) formbox.addRow(lbl_opis, self.txt_opis) groupbox_layout.addLayout(formbox) groupbox_layout.addLayout(button_hbox) groupbox.setLayout(groupbox_layout) vbox.addLayout(findbox) vbox.addWidget(groupbox) centralbox.addLayout(vbox) centralbox.addWidget(self.view) self.setLayout(centralbox) self.show() def table_init(self): """ Inicjuje wygląd tabeli """ self.model.setTable('uslugi') # query = QSqlQuery('SELECT uzytkownik_id, uzytkownik_nazwa, imie, nazwisko, pracownik FROM uzytkownik;') # self.model.setQuery(query) self.model.select() self.proxy.setSourceModel(self.model) naglowki = { 'uslugi_id': 'ID', 'nazwa': 'Nazwa', 'cena': 'Cena', "czas": 'Czas', 'Opis': 'Opis', } # Ustawianie nagłówków ilosc_kolumn = self.model.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model.headerData(i, Qt.Horizontal) self.model.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view.setSortingEnabled(True) self.view.setAlternatingRowColors(True) # Wczytanie danych self.view.setModel(self.proxy) self.view.hideColumn(0) self.view.sortByColumn(1, Qt.AscendingOrder) self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) def change(self): """ Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola """ index = (self.view.selectionModel().currentIndex()) value = index.sibling(index.row(), index.column()).data() self.id_modify = index.sibling(index.row(), 0).data() self.txt_nazwa.setText(index.sibling(index.row(), 1).data()) self.txt_cena.setText(str(index.sibling(index.row(), 2).data())) self.txt_czas.setText(index.sibling(index.row(), 3).data()) self.txt_opis.setText(index.sibling(index.row(), 4).data()) if self.id_modify >= 0 and self.txt_nazwa.text( ) and self.txt_cena.text() and self.txt_czas.text(): self.btn_mod.setEnabled(True) self.btn_usun.setEnabled(True) else: self.btn_usun.setDisabled(True) self.btn_mod.setDisabled(True) value.setText('') def if_checked(self, txt, q, val=None): """ Sprawdza poprawność wprowadzonych damych. :param val: wartości do zapytania :param q: zapytanie query MySql :param txt: komunikat """ if len(self.txt_nazwa.text()) < 3 or len( self.txt_cena.text()) < 1 or len(self.txt_czas.text()) < 2: msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(txt) msg.setWindowTitle("Popraw dane") msg.exec_() return False else: print('Trwa zmiana w bazie danych') if val: print('Połączenie') t = query_to_db(q, val) print(t) return t # = polaczenie(q, val) else: print('Transakcja') return transaction_to_db(q) def add(self): """ Dodaje nową usługę do bazy danych i odświeża widok. """ tekst = 'Nie wprowadzono wszystkich danych' # Dodanie nowego użytkownika query = 'INSERT INTO uslugi (nazwa, cena, czas, Opis) VALUES (%s, %s, %s, %s)' val = (self.txt_nazwa.text(), self.txt_cena.text().replace(',', '.'), self.txt_czas.text(), self.txt_opis.toPlainText()) if self.if_checked(tekst, query, val): msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Dodano nową usługę') msg.setWindowTitle("Dodano nową usługę") msg.exec_() else: msg = QMessageBox(self) msg.setIcon(QMessageBox.Warning) msg.setText('Usługa znajduje się już w bazie') msg.setWindowTitle("Błąd!") msg.exec_() # Odświeżanie widoku tabeli self.model.select() self.view.reset() def modify(self): """ Modyfikuje bazę danych """ test = 'Dane zostały błędnie zmodyfikowane.' query = 'UPDATE uslugi SET nazwa = %s, cena = %s, czas = %s, Opis = %s WHERE uslugi_id = %s;' val = (self.txt_nazwa.text(), self.txt_cena.text().replace(',', '.'), self.txt_czas.text(), self.txt_opis.toPlainText(), self.id_modify) if self.if_checked(test, query, val): msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Informacje o usłudze zostały pomyślnie zmodyfikowane') msg.setWindowTitle("Zmodyfikowano usługi") msg.exec_() # Odświeżanie widoku tabeli self.model.select() self.view.reset() def remove(self): """ Usuwa dane z bazy danych """ test = 'Błąd! Nie można usunąć danej usługi!' query2 = 'DELETE FROM wizyty WHERE uslugi_id = %s' query = 'DELETE FROM uslugi WHERE uslugi_id = %s' val = (self.id_modify, ) query1 = 'DELETE FROM uzytkownik_usluga WHERE uslugi_id = %s' ret = QMessageBox.question(self, 'Usuwanie usługi', "Czy na pewno chcesz usunąć daną usługę?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if ret == QMessageBox.Yes: if self.if_checked(test, [(query2, val), (query1, val), (query, val)]): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText('Usługa została usunięta') msg.setWindowTitle("Usunięto") msg.exec_() self.txt_nazwa.setText('') self.txt_cena.setText('') self.txt_czas.setText('') self.txt_opis.setText('') # Odświeżanie widoku tabeli self.model.select() self.view.reset() @pyqtSlot(str) def searching(self, text): """ Wyszukuje po wszystkich kolumnach tabeli :param text: """ search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp) self.proxy.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy.setFilterKeyColumn(1)
class MainWindow(QMainWindow): shortcuts = { "QUIT": "Ctrl+W", "ADD": "Ctrl+N", "EDIT": "Ctrl+I", "OPEN": "Ctrl+O", "OPEN-LEGACY": "Ctrl+Shift+O", "CREATE": "Ctrl+Shift+N", "SETTINGS": "Ctrl+Alt+S", "MANAGE-SCHEDULES": "" } icons = { "QUIT": ":/small/quit", "ADD": ":/medium/add", "EDIT": ":/medium/edit", "OPEN": ":/small/open", "OPEN-LEGACY": ":/small/open", "CREATE": ":/small/create", "SETTINGS": ":/small/settings", "MANAGE-SCHEDULES": ":/small/manage", "REMOVE": ":/medium/remove", "WINDOW": ":/small/window" } def __init__(self): super().__init__(flags=Qt.Window) # setup actions self.status_bar = self.statusBar() self.tool_bar = self.addToolBar("Video") # TODO: icon sizes self.tool_bar.setIconSize(QSize(36, 36)) # add the following 3 lines back in if you want the buttons to be right aligned # spacer = QWidget() # spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # self.tool_bar.addWidget(spacer) self.action_quit = QAction("Quit") self.action_quit.setShortcut(self.shortcuts["QUIT"]) self.action_quit.setIcon(QIcon(QPixmap(self.icons["QUIT"]))) self.action_quit.triggered.connect(self.close) self.action_add = QAction("Add Video") self.action_add.setShortcut(self.shortcuts["ADD"]) self.action_add.setIcon(QIcon(QPixmap(self.icons["ADD"]))) self.action_add.triggered.connect(self.add_video) self.action_edit = QAction("Edit Video Options") self.action_edit.setShortcut(self.shortcuts["EDIT"]) self.action_edit.setIcon(QIcon(QPixmap(self.icons["EDIT"]))) self.action_edit.triggered.connect(lambda: print("Action Edit Video")) self.action_open = QAction("Open") self.action_open.setShortcut(self.shortcuts["OPEN"]) self.action_open.setIcon(QIcon(QPixmap(self.icons["OPEN"]))) self.action_open.triggered.connect(lambda: print("Action Open")) self.action_open_legacy = QAction("Open Legacy File(.vst)") self.action_open_legacy.setShortcut(self.shortcuts["OPEN-LEGACY"]) self.action_open_legacy.setIcon(QIcon(QPixmap(self.icons["OPEN-LEGACY"]))) self.action_open_legacy.triggered.connect(lambda: print("Action Open Legacy")) self.action_create = QAction("Create Schedule") self.action_create.setShortcut(self.shortcuts["CREATE"]) self.action_create.setIcon(QIcon(QPixmap(self.icons["CREATE"]))) self.action_create.triggered.connect(self.create_schedule) self.action_settings = QAction("Settings") self.action_settings.setShortcut(self.shortcuts["SETTINGS"]) self.action_settings.setIcon(QIcon(QPixmap(self.icons["SETTINGS"]))) self.action_settings.triggered.connect(lambda: print("Action Settings")) self.action_remove = QAction("Remove Video") # self.action_remove.setShortcut(self.shortcuts["REMOVE"]) self.action_remove.setIcon(QIcon(QPixmap(self.icons["REMOVE"]))) self.action_remove.triggered.connect(self.table_right_clicked) # build views self.central_widget = QWidget(self, Qt.Widget) self.main_layout = QGridLayout() self.central_widget.setLayout(self.main_layout) self.schedule_layout = QHBoxLayout() picker_text = QLabel() picker_text.setText("Select Schedule:") self.schedule_picker = QComboBox() self.schedule_picker.currentIndexChanged.connect(lambda x: print("Picker!")) self.schedule_picker.addItems(["Item 1", "Item 2", "Item 3"]) self.schedule_layout.addWidget(self.schedule_picker) self.main_layout.addWidget(picker_text, 0, 0) self.main_layout.addChildLayout(self.schedule_layout) self.main_layout.addWidget(self.schedule_picker, 0, 1) self.video_table_view = QTableView(self) self.video_table_view.hideColumn(0) self.video_table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.main_layout.addWidget(self.video_table_view, 1, 0, 1, 4) self.video_table_view.customContextMenuRequested.connect(lambda: "right click") self.inspect_video_window = QDockWidget() lbl = QLabel() lbl.setText("I am a dock window label!") self.inspect_video_window.setWidget(lbl) self.addDockWidget(Qt.BottomDockWidgetArea, self.inspect_video_window) self.setCentralWidget(self.central_widget) self.init_ui() def add_video(self): # when add video event is clicked # does nothing - child will override this method pass def create_schedule(self): # when create schedule event is clicked # does nothing - child will override this method pass def table_right_clicked(self, position): print("Right clicked") menu = QMenu() menu.addAction(self.action_remove) menu.exec_(self.ui.table_videos.viewport().mapToGlobal(position)) pass @staticmethod def default_event(): # this is what all the onClicks, menu buttons, etc. get connected to by default # it does nothing - is just a placeholder pass def init_ui(self): self.setWindowTitle("Video Scheduler") self.setWindowIcon(QIcon(QPixmap(self.icons["WINDOW"]))) #with open("../darkstyle.qss") as f: # self.setStyleSheet(f.read()) self.resize(800, 600) self.setup_menu_bar() self.setup_toolbar() self.post_status_message() def setup_menu_bar(self): menu_bar = self.menuBar() file_menu = menu_bar.addMenu("File") file_menu.addAction(self.action_create) file_menu.addAction(self.action_open) file_menu.addAction(self.action_open_legacy) file_menu.addSeparator() file_menu.addAction(self.action_settings) file_menu.addSeparator() file_menu.addAction(self.action_quit) edit_menu = menu_bar.addMenu("Edit") edit_menu.addAction(self.action_add) edit_menu.addAction(self.action_edit) def setup_toolbar(self): self.tool_bar.show() self.tool_bar.addAction(self.action_add) self.tool_bar.addAction(self.action_edit) self.tool_bar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) def post_status_message(self): # status_bar_layout = self.status_bar.layout() now_playing = QLabel() now_playing.setText("Now playing: video1.mp4") time_left = QLabel() time_left.setText("Time left: 5:05") line = QFrame(self, Qt.Widget) # line.setObjectName(QString.fromUtf8("line")) # line.setGeometry(QRect(320, 150, 118, 3)) # line.setSiz line.setFrameShape(QFrame.VLine) line.setFrameShadow(QFrame.Sunken) # status_bar_layout.addWidget(now_playing) self.status_bar.addWidget(now_playing) self.status_bar.addWidget(line) self.status_bar.addWidget(time_left) @staticmethod def table_double_clicked(index): print(index.column()) if index.column() == 0: # we want to open a file dialog to choose new video filename, status = QFileDialog.getOpenFileName(caption="Choose Video File") print(filename) else: return
def on_s_catalog_btn(parent, db_path): def on_add_supp(): sm.insertRow(sm.rowCount()) def on_del_supp(): sm.removeRow(smv.currentIndex().row()) # Выполняем повторное считывание данных в модель, # чтобы убрать пустую "мусорную" запись sm.select() def on_data_change(sm): sm.submitAll() # Считаем количество записей после сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS new_count FROM suppliers") query.next() recordCount = query.record() new_count_int = query.value(recordCount.indexOf("new_count")) if old_count_int != new_count_int: msg_lbl = QLabel( '<span style="color:green">Добавлен новый поставщик</span>') parent.sm_list_widget.clear() parent.item = QListWidgetItem() parent.sm_list_widget.addItem(parent.item) parent.sm_list_widget.setItemWidget(parent.item, msg_lbl) # Устанавливаем соединение с базой данных con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName(db_path) con.open() # Создаем окно-таблицу parent.supp_table_window = QWidget() parent.supp_table_window.setWindowModality(QtCore.Qt.ApplicationModal) parent.supp_table_window.setWindowTitle("Поставщики") parent.supp_table_window.resize(740, 250) sm = QtSql.QSqlTableModel(parent=parent.supp_table_window) sm.setTable('suppliers') sm.setSort(0, QtCore.Qt.AscendingOrder) sm.select() sm.setHeaderData(1, QtCore.Qt.Horizontal, 'Название') sm.setHeaderData(2, QtCore.Qt.Horizontal, 'Форма собственности') sm.setHeaderData(3, QtCore.Qt.Horizontal, 'Адрес') sm.setHeaderData(4, QtCore.Qt.Horizontal, 'Телефон') sm.setHeaderData(5, QtCore.Qt.Horizontal, 'e-mail') smv = QTableView() smv.setModel(sm) smv.setColumnWidth(1, 150) smv.setColumnWidth(2, 150) smv.setColumnWidth(3, 200) smv.setColumnWidth(4, 100) smv.setColumnWidth(5, 100) smv.hideColumn(0) vbox = QVBoxLayout() vbox.addWidget(smv) btnAdd = QPushButton("Добавить поставщика") btnAdd.clicked.connect(on_add_supp) vbox.addWidget(btnAdd) btnDel = QPushButton("Удалить поставщика") btnDel.clicked.connect(on_del_supp) vbox.addWidget(btnDel) parent.supp_table_window.setLayout(vbox) parent.supp_table_window.show() # Считаем количество записей до сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS old_count FROM suppliers") query.next() recordCount = query.record() old_count_int = query.value(recordCount.indexOf("old_count")) query.finish() sm.dataChanged.connect(lambda: on_data_change(sm)) screen = QDesktopWidget().screenGeometry() x = int((screen.width() - parent.supp_table_window.width()) / 2) y = int((screen.height() - parent.supp_table_window.height()) / 2) parent.supp_table_window.move(x, y)
def on_e_catalog_btn(parent, db_path): def on_add_employee(): em.insertRow(em.rowCount()) def on_del_employee(): em.removeRow(emv.currentIndex().row()) em.select() def on_data_change(em): em.submitAll() # Считаем количество записей после сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS new_count FROM employee") query.next() recordCount = query.record() new_count_int = query.value(recordCount.indexOf("new_count")) if old_count_int != new_count_int: msg_lbl = QLabel( '<span style="color:green">Добавлен новый сотрудник</span>') parent.sm_list_widget.clear() parent.item = QListWidgetItem() parent.sm_list_widget.addItem(parent.item) parent.sm_list_widget.setItemWidget(parent.item, msg_lbl) con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName(db_path) con.open() parent.employee_table_window = QWidget() parent.employee_table_window.setWindowModality( QtCore.Qt.ApplicationModal) parent.employee_table_window.setWindowTitle("Список сотрудников") parent.employee_table_window.resize(240, 250) em = QtSql.QSqlRelationalTableModel( parent=parent.employee_table_window) em.setTable('employee') em.setSort(0, QtCore.Qt.AscendingOrder) em.setRelation( 2, QtSql.QSqlRelation( 'positions', 'position', 'position')) em.select() em.setHeaderData(1, QtCore.Qt.Horizontal, 'ФИО') em.setHeaderData(2, QtCore.Qt.Horizontal, 'Должность') emv = QTableView() emv.setModel(em) emv.setItemDelegate(QtSql.QSqlRelationalDelegate(emv)) emv.hideColumn(0) vbox = QVBoxLayout() vbox.addWidget(emv) btnAdd = QPushButton("Добавить сотрудника") btnAdd.clicked.connect(on_add_employee) vbox.addWidget(btnAdd) btnDel = QPushButton("Удалить сотрудника") btnDel.clicked.connect(on_del_employee) vbox.addWidget(btnDel) parent.employee_table_window.setLayout(vbox) parent.employee_table_window.show() # Считаем количество записей до сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS old_count FROM employee") query.next() recordCount = query.record() old_count_int = query.value(recordCount.indexOf("old_count")) query.finish() em.dataChanged.connect(lambda: on_data_change(em)) screen = QDesktopWidget().screenGeometry() x = int((screen.width() - parent.employee_table_window.width()) / 2) y = int((screen.height() - parent.employee_table_window.height()) / 2) parent.employee_table_window.move(x, y)
class App(QWidget): def __init__(self): super().__init__() self.title = 'Leet Password Manager' self.left = 0 self.top = 0 self.width = 300 self.height = 200 self.cols = ['id', 'title', 'username', 'password'] self.init_ui() self.secrets = Secrets('vault.yml', 'password') self.secrets.read() #self.populate_table(self.secrets) def init_ui(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self.create_table() # Add box layout, add table to box layout and add box layout to widget self.layout = QVBoxLayout() self.layout.addWidget(self.tableWidget) self.setLayout(self.layout) self.pwdSc = QShortcut(QKeySequence('Ctrl+C'), self) # self.pwdSc.activated.connect(lambda : QMessageBox.information(self, # 'Message', 'Ctrl + C initiated')) self.pwdSc.activated.connect(lambda: self.copy_password()) self.userSc = QShortcut(QKeySequence('Ctrl+B'), self) self.userSc.activated.connect(lambda: self.copy_username()) # Show widget self.show() #self.add_row_to_table() self.show() def create_table(self): # Create table # self.tableWidget = QTableWidget() # self.tableWidget.setRowCount(0) # self.tableWidget.setColumnCount(len(self.cols)) # self.tableWidget.move(0,0) self.tableWidget = QTableView() # self.tableModel = TableModel([['0', 'hi', 'mom'], ['1', 'hello', 'dad']]) self.tableModel = TableModel() self.tableModel.add_data([['0000', 'hi', 'mom'], ['1111', 'hello', 'dad']]) self.tableModel.setHorizontalHeaderLabels(['id', 'username', 'password']) self.tableWidget.setModel(self.tableModel) self.tableWidget.hideColumn(0) # table selection change self.tableWidget.doubleClicked.connect(self.on_click) def add_row_to_table(self): last_row = self.tableWidget.rowCount() self.tableWidget.insertRow(last_row) self.tableWidget.setItem(last_row, 0, QTableWidgetItem("Hi mom")) def populate_table(self, secrets): row = self.tableWidget.rowCount() for entry in secrets.entries(): self.tableWidget.insertRow(row) col_idx = 0 for col in self.cols: self.tableWidget.setItem(row, col_idx, QTableWidgetItem(entry[col])) col_idx += 1 @pyqtSlot() def on_click(self): print("\n") for currentQTableWidgetItem in self.tableWidget.selectedItems(): print(currentQTableWidgetItem.row(), currentQTableWidgetItem.column(), currentQTableWidgetItem.text()) def copy_password(self): # Copy the password to the paste buffer cb = QApplication.clipboard() cb.clear(mode=cb.Clipboard) item = self.currently_selected() print(item) cb.setText("Clipboard text", mode=cb.Clipboard) def copy_username(self): cb = QApplication.clipboard() cb.clear(mode=cb.Clipboard) item = self.currently_selected() print(item) cb.setText("Clipboard text", mode=cb.Clipboard) def currently_selected(self): # Returns the currently selected row id. indices = self.tableWidget.selectedIndexes() row_num = indices[0].row() row_id = self.tableModel.data(indices[0], Qt.UserRole) return row_id
def on_u_catalog_btn(parent, db_path): def on_add_user(): # Добавляем строку um.insertRow(um.rowCount()) def on_del_user(): # Удаляем строку um.removeRow(umv.currentIndex().row()) # Выполняем повторное считывание данных в модель, # чтобы убрать пустую "мусорную" запись um.select() def on_data_change(um): um.submitAll() # Считаем количество записей после сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS new_count FROM users") query.next() recordCount = query.record() new_count_int = query.value(recordCount.indexOf("new_count")) if old_count_int != new_count_int: msg_lbl = QLabel( '<span style="color:green">Добавлен новый пользователь</span>') parent.sm_list_widget.clear() parent.item = QListWidgetItem() parent.sm_list_widget.addItem(parent.item) parent.sm_list_widget.setItemWidget(parent.item, msg_lbl) # Устанавливаем соединение с базой данных con = QtSql.QSqlDatabase.addDatabase('QSQLITE') con.setDatabaseName(db_path) con.open() # Создаем окно parent.u_table_window = QWidget() parent.u_table_window.setWindowModality(QtCore.Qt.ApplicationModal) parent.u_table_window.setWindowTitle("Справочник 'Пользователи'") parent.u_table_window.resize(440, 300) # Создаем модель um = QtSql.QSqlRelationalTableModel(parent=parent.u_table_window) # Связываем таблицу с моделью um.setTable('users') um.setSort(0, QtCore.Qt.AscendingOrder) # Устанавливаем связь с внешней таблицей um.setRelation(4, QtSql.QSqlRelation('rules', 'rule', 'rule')) # Считываем данные в модель um.select() # Задаем заголовки для столбцов модели um.setHeaderData(1, QtCore.Qt.Horizontal, 'Логин') um.setHeaderData(2, QtCore.Qt.Horizontal, 'Пароль') um.setHeaderData(3, QtCore.Qt.Horizontal, 'Имя') um.setHeaderData(4, QtCore.Qt.Horizontal, 'Права') # При изменении данных выполняем сохранение # Считаем количество записей до сохранения query = QtSql.QSqlQuery() query.exec("SELECT COUNT(*) AS old_count FROM users") query.next() recordCount = query.record() old_count_int = query.value(recordCount.indexOf("old_count")) query.finish() um.dataChanged.connect(lambda: on_data_change(um)) # Создаем виджет-таблицу umv = QTableView() # Связываем модель с виджетом-таблицей umv.setModel(um) umv.setItemDelegate(QtSql.QSqlRelationalDelegate(umv)) umv.hideColumn(0) # Создаем контейнер users_vbox = QVBoxLayout() users_vbox.addWidget(umv) # Создаем кнопки и размещаем их в контейнеры btnAdd = QPushButton("Добавить пользователя") btnAdd.clicked.connect(on_add_user) users_vbox.addWidget(btnAdd) btnDel = QPushButton("Удалить пользователя") btnDel.clicked.connect(on_del_user) users_vbox.addWidget(btnDel) # Размещаем контейнер в окне parent.u_table_window.setLayout(users_vbox) parent.u_table_window.show() screen = QDesktopWidget().screenGeometry() x = int((screen.width() - parent.u_table_window.width()) / 2) y = int((screen.height() - parent.u_table_window.height()) / 2) parent.u_table_window.move(x, y)
# Устанавливаем соединение с базой данных conn = QSqlDatabase.addDatabase('QSQLITE') # Определяем путь до базы данных conn.setDatabaseName('test.sqlite3') # Открываем базу данных conn.open() T_WIND = QTableView() T_WIND.setWindowTitle("Виджет-таблица на основе модели-запроса") # Создаем модель T_QUERY = QSqlQueryModel(parent=T_WIND) T_QUERY.setQuery("SELECT * FROM vendors ORDER BY name") # Задаем заголовки для столбцов модели T_QUERY.setHeaderData(1, QtCore.Qt.Horizontal, 'Название') T_QUERY.setHeaderData(2, QtCore.Qt.Horizontal, 'Телефон') T_QUERY.setHeaderData(3, QtCore.Qt.Horizontal, 'Адрес') # Задаем для таблицы только что созданную модель T_WIND.setModel(T_QUERY) # Скрываем первый столбец, в котором выводится идентификатор T_WIND.hideColumn(0) T_WIND.setColumnWidth(1, 150) T_WIND.setColumnWidth(2, 100) T_WIND.setColumnWidth(3, 200) T_WIND.resize(470, 130) T_WIND.show() sys.exit(APP.exec_())
'dbID': 2, 'parent_ID': 1, 'short_name': 'Дивизия 9', 'order': 2, 'pos': 23 }] app = QApplication(sys.argv) frm = Form() window = MyTree(data) window.setGeometry(600, 50, 400, 470) window.setWindowTitle("Hierarhy") window.show() model = CustomSqlModel() view = QTableView() view.resizeColumnsToContents() view.setModel(model) view.setWindowTitle("Hierarhy") view.hideColumn(0) view.hideColumn(1) view.hideColumn(3) view.hideColumn(4) view.setColumnWidth(2, 300) view.resize(300, 470) view.show() sys.exit(app.exec_())
class ServEmpl(QWidget): """ Klasa odpowiedzialna za widget pracownicy-usługi """ def __init__(self, parent, db): super(QWidget, self).__init__(parent) self.parent = parent self.lbl_imie = QLabel() self.lbl_nazwisko = QLabel() self.view_p = QTableView() self.view_pu = QTableView() self.view_u = QTableView() self.proxy_p = QSortFilterProxyModel(self) self.proxy_pu = QSortFilterProxyModel(self) self.proxy_u = QSortFilterProxyModel(self) self.id_pracownik = -1 # Parametry połączenia z bazą self.model_p = QSqlTableModel(self, db) self.model_pu = QSqlRelationalTableModel(self, db) self.model_u = QSqlTableModel(self, db) self.initUI() def initUI(self): """ Inicjuje UI """ pracownicy = ''' Kliknij <u>tutaj</u> aby wybrać danego pracownika. Poniżej znajdują się wszystkie usługi, jakie dany pracownik może robić. ''' uslugi = ''' Kliknij dwukrotnie <u>tutaj</u> aby <b>przypisać</b> daną usługę do wybranego pracownika. ''' pracownik_uslugi = ''' Kliknij dwukrotnie <u>tutaj</u> aby <b>usunąć</b> przypisanie danej usługi pracownikowi. ''' self.table_init_u() self.table_init_p() self.table_init_pu() self.view_p.setToolTip(pracownicy) self.view_u.setToolTip(uslugi) self.view_pu.setToolTip(pracownik_uslugi) # Tworzenie kontrolek lbl_wyszukaj = QLabel('Wyszukaj pracownika:') lbl_imie_static = QLabel('Imię:') lbl_nazwisko_static = QLabel('Nazwisko:') txt_wysz = QLineEdit(self) # Tworzenie widoków centralbox = QHBoxLayout() hbox_p = QHBoxLayout() hbox_pu = QHBoxLayout() hbox_u = QHBoxLayout() vbox_right = QVBoxLayout() vbox_left = QVBoxLayout() groupbox_p = QGroupBox('Pracownicy') groupbox_pu = QGroupBox('Wykonywane usługi') groupbox_u = QGroupBox('Usługi') formbox = QFormLayout() # Metody txt_wysz.textChanged.connect(self.searching) self.view_p.clicked.connect(self.change_p) self.view_u.doubleClicked.connect(lambda: self.change_add_remove(True)) self.view_pu.doubleClicked.connect(lambda: self.change_add_remove(False)) # Ustawianie widoków formbox.addRow(lbl_wyszukaj, txt_wysz) formbox.addRow(lbl_imie_static, self.lbl_imie) formbox.addRow(lbl_nazwisko_static, self.lbl_nazwisko) formbox.setSpacing(15) vbox_left.addLayout(formbox) vbox_left.addWidget(groupbox_u) vbox_left.setSpacing(200) hbox_p.addWidget(self.view_p) hbox_pu.addWidget(self.view_pu) hbox_u.addWidget(self.view_u) groupbox_p.setLayout(hbox_p) groupbox_pu.setLayout(hbox_pu) groupbox_u.setLayout(hbox_u) vbox_right.addWidget(groupbox_p) vbox_right.addWidget(groupbox_pu) vbox_right.setSpacing(25) centralbox.addLayout(vbox_left) centralbox.addLayout(vbox_right) self.setLayout(centralbox) self.show() def change_p(self): """ Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola """ index = (self.view_p.selectionModel().currentIndex()) self.id_pracownik = index.sibling(index.row(), 0).data() self.lbl_imie.setText("<b>" + index.sibling(index.row(), 2).data() + "</b>") self.lbl_nazwisko.setText("<b>" + index.sibling(index.row(), 3).data() + "</b>") # Odświeżanie widoku tabeli query = QSqlQuery( 'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, uslugi.czas FROM uslugi, uzytkownik_usluga WHERE ' 'uslugi.uslugi_id = uzytkownik_usluga.uslugi_id AND uzytkownik_usluga.uzytkownik_id = ' + str( self.id_pracownik) + ';') self.model_pu.setQuery(query) self.view_pu.reset() def change_add_remove(self, quest): """ Metoda ogólna odpowiadająca za dodawanie i usuwanie usług wybranemu pracownikowi """ tekst_p = "Czy chcesz dodać nową usługę do użytkownika {}?".format(self.lbl_imie.text()) if quest: index = (self.view_u.selectionModel().currentIndex()) id_modify = index.sibling(index.row(), 0).data() ret = QMessageBox.question(self, 'Dodawanie usługi', tekst_p, QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if ret == QMessageBox.Yes: query = 'INSERT INTO uzytkownik_usluga (uzytkownik_id, uslugi_id) VALUES (%s, %s); ' val = ( self.id_pracownik, id_modify ) if query_to_db(query, val): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText('Usługa została dodana do usług oferowanych przez pracownika') msg.setWindowTitle("Dodano usługę") msg.exec_() else: index = (self.view_pu.selectionModel().currentIndex()) id_modify = index.sibling(index.row(), 0).data() ret = QMessageBox.question(self, 'Usuwanie usługi', "Czy na pewno chcesz usunąć daną usługę?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if ret == QMessageBox.Yes: query = 'DELETE FROM uzytkownik_usluga WHERE uzytkownik_id = %s AND uslugi_id = %s; ' val = ( self.id_pracownik, id_modify ) if query_to_db(query, val): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText('Usługa została dodana do usług oferowanych przez pracownika') msg.setWindowTitle("Dodano usługę") msg.exec_() # Odświeżanie widoku tabeli query = QSqlQuery( 'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, uslugi.czas FROM uslugi, uzytkownik_usluga WHERE ' 'uslugi.uslugi_id = uzytkownik_usluga.uslugi_id AND uzytkownik_usluga.uzytkownik_id = ' + str( self.id_pracownik) + ';') self.model_pu.setQuery(query) self.view_pu.reset() def table_init_u(self): """ Inicjuje wygląd tabeli usługi """ self.model_u.setTable('uslugi') # query = QSqlQuery('SELECT uzytkownik_id, uzytkownik_nazwa, imie, nazwisko, pracownik FROM uzytkownik;') # self.model.setQuery(query) self.model_u.select() self.proxy_u.setSourceModel(self.model_u) naglowki = { 'uslugi_id': 'ID', 'nazwa': 'Nazwa', 'cena': 'Cena', "czas": 'Czas', 'Opis': 'Opis', } # Ustawianie nagłówków ilosc_kolumn = self.model_u.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model_u.headerData(i, Qt.Horizontal) self.model_u.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view_u.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view_u.setSortingEnabled(True) self.view_u.setAlternatingRowColors(True) # Wczytanie danych self.view_u.setModel(self.proxy_u) self.view_u.hideColumn(0) self.view_u.sortByColumn(1, Qt.AscendingOrder) self.view_u.setEditTriggers(QAbstractItemView.NoEditTriggers) def table_init_p(self): """ Inicjuje wygląd tabeli pracownicy """ self.model_p.setTable('pracownicy') query = QSqlQuery('SELECT uzytkownik_id, uzytkownik_nazwa, imie, nazwisko, pracownik FROM uzytkownik WHERE pracownik = 1;') self.model_p.setQuery(query) # self.model_u.select() self.proxy_p.setSourceModel(self.model_p) naglowki = { 'uzytkownik_id': 'ID', 'uzytkownik_nazwa': 'Login', 'imie': 'Imię', "nazwisko": 'Nazwisko', 'pracownik': 'Pracownik', } # Ustawianie nagłówków ilosc_kolumn = self.model_p.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model_p.headerData(i, Qt.Horizontal) self.model_p.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view_p.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view_p.setSortingEnabled(True) self.view_p.setAlternatingRowColors(True) # Wczytanie danych self.view_p.setModel(self.proxy_p) self.view_p.hideColumn(0) self.view_p.hideColumn(4) self.view_p.sortByColumn(1, Qt.AscendingOrder) self.view_p.setEditTriggers(QAbstractItemView.NoEditTriggers) def table_init_pu(self): """ Inicjuje wygląd tabeli pracownicy-usługi """ query = QSqlQuery( 'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, uslugi.czas FROM uslugi, uzytkownik_usluga WHERE ' 'uslugi.uslugi_id = uzytkownik_usluga.uslugi_id AND uzytkownik_usluga.uzytkownik_id = ' + str( self.id_pracownik) + ';') self.model_pu.setQuery(query) self.proxy_pu.setSourceModel(self.model_pu) naglowki = { 'uslugi_id': 'ID usługi', 'nazwa': 'Nazwa usługi', 'cena': 'Cena', 'czas': 'Czas' } # Ustawianie nagłówków ilosc_kolumn = self.model_pu.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model_pu.headerData(i, Qt.Horizontal) self.model_pu.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view_pu.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view_pu.setSortingEnabled(True) self.view_pu.setAlternatingRowColors(True) # Wczytanie danych self.view_pu.setModel(self.proxy_pu) self.view_pu.hideColumn(0) self.view_pu.sortByColumn(1, Qt.AscendingOrder) self.view_pu.setEditTriggers(QAbstractItemView.NoEditTriggers) @pyqtSlot(str) def searching(self, text): """ Wyszukuje po wszystkich kolumnach tabeli :param text: """ search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp ) self.proxy_p.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy_p.setFilterKeyColumn(1)
class Employee(QWidget): """ Klasa odpowiedzialna za widget Zmiany hasła """ def __init__(self, parent, db): super(QWidget, self).__init__(parent) self.btn_usun = QPushButton('Usuń') self.btn_modyfikuj = QPushButton('Modyfikuj') self.id_modify = -1 self.view = QTableView() self.cb_pracownik = QCheckBox('Pracownik') self.txt_login = QLineEdit() self.txt_nazwisko = QLineEdit() self.txt_imie = QLineEdit() self.parent = parent self.layout = QHBoxLayout() self.lbl_wysz = QLabel("Wyszukaj:") self.txt_wysz = QLineEdit(self) self.proxy = QSortFilterProxyModel(self) # Parametry połączenia z bazą self.model = QSqlTableModel(self, db) self.initUI() def initUI(self): """ Inicjuje UI """ fbox = QFormLayout() fbox.addRow(self.lbl_wysz, self.txt_wysz) self.txt_wysz.textChanged.connect(self.searching) self.table_init() # Pokazuje wszystko # self.model.select() group_box = QGroupBox("Edycja danych użytkownika") fbox2 = QFormLayout() lbl_imie = QLabel('Imię:') lbl_nazwisko = QLabel('Nazwisko:') lbl_login = QLabel('Login:'******'Dodaj') self.btn_modyfikuj.setDisabled(True) self.btn_usun.setDisabled(True) fbox2.addRow(lbl_imie, self.txt_imie) fbox2.addRow(lbl_nazwisko, self.txt_nazwisko) fbox2.addRow(lbl_login, self.txt_login) fbox2.addRow(self.cb_pracownik) lhbox = QHBoxLayout() lhbox.addWidget(self.btn_usun) lhbox.addSpacing(35) lhbox.addWidget(self.btn_modyfikuj) lhbox.addSpacing(35) lhbox.addWidget(btn_dodaj) fbox2.addRow(lhbox) group_box.setLayout(fbox2) fbox.addRow(group_box) # Formatka dni self.group_box_dni = QGroupBox('Godziny pracy') fbox_dni = QFormLayout() lhbox_pon = QHBoxLayout() lhbox_wt = QHBoxLayout() lhbox_sr = QHBoxLayout() lhbox_czw = QHBoxLayout() lhbox_pt = QHBoxLayout() lhbox_sob = QHBoxLayout() lbl_pon = QLabel('Poniedziałek') lbl_wt = QLabel('Wtorek') lbl_sr = QLabel('Środa') lbl_czw = QLabel('Czwartek') lbl_pt = QLabel('Piątek') lbl_sob = QLabel('Sobota') self.txt_pon_od = QLineEdit() self.txt_pon_do = QLineEdit() self.txt_wt_od = QLineEdit() self.txt_wt_do = QLineEdit() self.txt_sr_od = QLineEdit() self.txt_sr_do = QLineEdit() self.txt_czw_od = QLineEdit() self.txt_czw_do = QLineEdit() self.txt_pt_od = QLineEdit() self.txt_pt_do = QLineEdit() self.txt_sob_od = QLineEdit() self.txt_sob_do = QLineEdit() self.pola = (self.txt_pon_od, self.txt_pon_do, self.txt_wt_od, self.txt_wt_do, self.txt_sr_od, self.txt_sr_do, self.txt_czw_od, self.txt_czw_do, self.txt_pt_od, self.txt_pt_do, self.txt_sob_od, self.txt_sob_do) lhbox_pon.addWidget(self.txt_pon_od) lhbox_pon.addSpacing(30) lhbox_pon.addWidget(self.txt_pon_do) lhbox_wt.addWidget(self.txt_wt_od) lhbox_wt.addSpacing(30) lhbox_wt.addWidget(self.txt_wt_do) lhbox_sr.addWidget(self.txt_sr_od) lhbox_sr.addSpacing(30) lhbox_sr.addWidget(self.txt_sr_do) lhbox_czw.addWidget(self.txt_czw_od) lhbox_czw.addSpacing(30) lhbox_czw.addWidget(self.txt_czw_do) lhbox_pt.addWidget(self.txt_pt_od) lhbox_pt.addSpacing(30) lhbox_pt.addWidget(self.txt_pt_do) lhbox_sob.addWidget(self.txt_sob_od) lhbox_sob.addSpacing(30) lhbox_sob.addWidget(self.txt_sob_do) fbox_dni.addRow(lbl_pon, lhbox_pon) fbox_dni.addRow(lbl_wt, lhbox_wt) fbox_dni.addRow(lbl_sr, lhbox_sr) fbox_dni.addRow(lbl_czw, lhbox_czw) fbox_dni.addRow(lbl_pt, lhbox_pt) fbox_dni.addRow(lbl_sob, lhbox_sob) group_box_szablon = QGroupBox('Szablony') btn1 = QPushButton('7-15') btn2 = QPushButton('8-16') btn3 = QPushButton('9-17') btn4 = QPushButton('10-18') vbox = QVBoxLayout() vbox.addWidget(btn1) vbox.addWidget(btn2) vbox.addWidget(btn3) vbox.addWidget(btn4) group_box_szablon.setLayout(vbox) hbox_dni = QHBoxLayout() hbox_dni.addLayout(fbox_dni) hbox_dni.addWidget(group_box_szablon) self.group_box_dni.setLayout(hbox_dni) fbox.addRow(self.group_box_dni) self.group_box_dni.setVisible(False) self.view.clicked.connect(self.change) btn_dodaj.clicked.connect(self.add) self.btn_modyfikuj.clicked.connect(self.modify) self.btn_usun.clicked.connect(self.remove) self.cb_pracownik.stateChanged.connect(self.changeGroupBox) btn1.clicked.connect(lambda: self.hour(7)) btn2.clicked.connect(lambda: self.hour(8)) btn3.clicked.connect(lambda: self.hour(9)) btn4.clicked.connect(lambda: self.hour(10)) self.layout.addLayout(fbox) self.layout.addWidget(self.view) self.setLayout(self.layout) self.show() def hour(self, godz): """ Wypełnia godzinami odpowiednie pola :param godz: int godzina rozpoczęcia """ for i, value in enumerate(self.pola): if i % 2 == 0: value.setText(str(timedelta(hours=godz))) else: value.setText(str(timedelta(hours=godz + 8))) def changeGroupBox(self, state): """ Sprawdza, czy zaznaczono checkbox pracownik :param state: status pola pracownik """ if state == Qt.Checked: self.group_box_dni.setVisible(True) else: self.group_box_dni.setVisible(False) def table_init(self): """ Inicjuje wygląd tabeli """ self.model.setTable('uzytkownik') query = QSqlQuery( 'SELECT uzytkownik_id, uzytkownik_nazwa, imie, nazwisko, pracownik FROM uzytkownik;' ) self.model.setQuery(query) self.proxy.setSourceModel(self.model) naglowki = { 'uzytkownik_id': 'ID', 'uzytkownik_nazwa': 'Login', 'imie': 'Imię', "nazwisko": 'Nazwisko', 'pracownik': 'Pracownik', } # Ustawianie nagłówków ilosc_kolumn = self.model.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model.headerData(i, Qt.Horizontal) self.model.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) # TODO Poprawić wiywietlanie kolumny Pracownik self.view.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view.setSortingEnabled(True) self.view.setAlternatingRowColors(True) # Wczytanie danych self.view.setModel(self.proxy) self.view.hideColumn(0) self.view.sortByColumn(1, Qt.AscendingOrder) self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) def if_checked(self, txt, q, val=None): """ Sprawdza poprawność wprowadzonych damych. :param val: wartości do zapytania :param q: zapytanie query MySql :param txt: komunikat """ if len(self.txt_imie.text()) < 2 or len( self.txt_nazwisko.text()) < 2 or len( self.txt_login.text()) < 5: msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(txt) msg.setWindowTitle("Popraw dane") msg.exec_() return False else: print('Trwa zmiana w bazie danych') if val: print('Połączenie') query_to_db(q, val) else: print('Transakcja') return transaction_to_db(q) # Odświeżanie widoku tabeli self.model.select() self.view.reset() return True def employee_type(self): """ Sprawdza, czy dana osoba jest pracownikiem, czy nie. :return: int Pracownik """ return 1 if self.cb_pracownik.checkState() else 0 def add(self): """ Dodaje nową osobę do bazy danych i odświeża widok. """ tekst = "Dane zostały błędnie wprowadzone.\nLogin musi mieć minimum 5 znaków." # Dodanie nowego użytkownika query1 = 'INSERT INTO uzytkownik (imie, nazwisko, uzytkownik_nazwa, haslo, pracownik) VALUES (%s, %s, %s, ' \ 'sha(%s), %s)' val1 = (self.txt_imie.text(), self.txt_nazwisko.text(), self.txt_login.text(), self.txt_login.text(), self.employee_type()) # Dodanie godzin do pracownika if self.cb_pracownik.checkState(): query2 = 'INSERT INTO godziny (uzytkownik_id, pon_od, pon_do, wt_od, wt_do, sr_od, sr_do, czw_od, czw_do, pt_od, pt_do, sob_od, sob_do) VALUES (LAST_INSERT_ID(),"' + self.txt_pon_od.text( ) + '","' + self.txt_pon_do.text() + '","' + self.txt_wt_od.text( ) + '","' + self.txt_wt_do.text() + '","' + self.txt_sr_od.text( ) + '","' + self.txt_sr_do.text() + '","' + self.txt_czw_od.text( ) + '","' + self.txt_czw_do.text() + '","' + self.txt_pt_od.text( ) + '","' + self.txt_pt_do.text() + '","' + self.txt_sob_od.text( ) + '","' + self.txt_sob_do.text() + '");' val2 = None else: query2 = None val2 = None if self.if_checked(tekst, [(query1, val1), (query2, val2)]): msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Dodano nowego użytkownika') msg.setWindowTitle("Dodano użytkownika") msg.exec_() else: msg = QMessageBox(self) msg.setIcon(QMessageBox.Warning) msg.setText('Dany użytkownik istnieje już w bazie') msg.setWindowTitle("Błąd!") msg.exec_() # Odświeżanie widoku tabeli self.model.select() self.view.reset() def modify(self): """ Modyfikuje bazę danych """ query = 'SELECT * FROM godziny WHERE uzytkownik_id = %s' val = (self.id_modify, ) wynik = query_to_db(query, val) test = 'Dane zostały błędnie zmodyfikowane.' query = 'UPDATE uzytkownik SET imie = %s, nazwisko = %s, uzytkownik_nazwa = %s, ' \ 'pracownik = %s WHERE uzytkownik_id = %s' val = (self.txt_imie.text(), self.txt_nazwisko.text(), self.txt_login.text(), self.employee_type(), self.id_modify) self.if_checked(test, query, val) if wynik and self.cb_pracownik.checkState(): query = 'UPDATE godziny SET pon_od = %s, pon_do = %s, wt_od = %s, wt_do = %s, sr_od = %s, sr_do = %s, ' \ 'czw_od = %s, czw_do = %s, pt_od = %s, pt_do = %s, sob_od = %s, sob_do = %s WHERE uzytkownik_id = %s;' val = (self.txt_pon_od.text(), self.txt_pon_do.text(), self.txt_wt_od.text(), self.txt_wt_do.text(), self.txt_sr_od.text(), self.txt_sr_do.text(), self.txt_czw_od.text(), self.txt_czw_do.text(), self.txt_pt_od.text(), self.txt_pt_do.text(), self.txt_sob_od.text(), self.txt_sob_do.text(), self.id_modify) query_to_db(query, val) elif self.cb_pracownik.checkState(): query = 'INSERT INTO godziny SET uzytkownik_id = %s, pon_od = %s, pon_do = %s, wt_od = %s, wt_do = %s, ' \ 'sr_od = %s, ' \ 'sr_do = %s, ' \ 'czw_od = %s, czw_do = %s, pt_od = %s, pt_do = %s, sob_od = %s, sob_do = %s; ' val = (self.id_modify, self.txt_pon_od.text(), self.txt_pon_do.text(), self.txt_wt_od.text(), self.txt_wt_do.text(), self.txt_sr_od.text(), self.txt_sr_do.text(), self.txt_czw_od.text(), self.txt_czw_do.text(), self.txt_pt_od.text(), self.txt_pt_do.text(), self.txt_sob_od.text(), self.txt_sob_do.text()) query_to_db(query, val) msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Zmodyfikowano dane użytkownika') msg.setWindowTitle("Zmodyfikowano użytkownika") msg.exec_() # Odświeżanie widoku tabeli self.model.select() self.view.reset() def remove(self): """ Usuwa dane z bazy danych """ test = 'Błąd! Nie można usunąć danego użytkownika!' query1 = 'DELETE FROM uzytkownik WHERE uzytkownik_id = %s' val = (self.id_modify, ) query2 = 'DELETE FROM godziny WHERE uzytkownik_id = %s' query3 = 'DELETE FROM uzytkownik_usluga WHERE uzytkownik_id = %s' query4 = 'DELETE FROM wizyty WHERE uzytkownik_id = %s' if self.id_modify == 1: msg = QMessageBox() msg.setIcon(QMessageBox.Critical) msg.setText('Błąd! Nie można usunąć domyślnego użytkownika') msg.setWindowTitle("Popraw dane") msg.exec_() else: ret = QMessageBox.question( self, 'Usuwanie użytkownika', "Czy na pewno chcesz usunąć danego użytkownika?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if ret == QMessageBox.Yes: if self.if_checked(test, [(query4, val), (query3, val), (query2, val), (query1, val)]): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText('Użytkownik został usunięty') msg.setWindowTitle("Usunięto") msg.exec_() self.txt_imie.setText('') self.txt_login.setText('') self.txt_nazwisko.setText('') if self.cb_pracownik.checkState(): self.cb_pracownik.toggle() # Odświeżanie widoku tabeli self.model.select() self.view.reset() def change(self): """ Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola """ index = (self.view.selectionModel().currentIndex()) value = index.sibling(index.row(), index.column()).data() self.id_modify = index.sibling(index.row(), 0).data() self.txt_imie.setText(index.sibling(index.row(), 2).data()) self.txt_nazwisko.setText(index.sibling(index.row(), 3).data()) self.txt_login.setText(index.sibling(index.row(), 1).data()) if self.id_modify >= 0 and self.txt_imie.text( ) and self.txt_login.text() and self.txt_nazwisko.text(): self.btn_modyfikuj.setEnabled(True) self.btn_usun.setEnabled(True) else: self.btn_usun.setDisabled(True) self.btn_modyfikuj.setDisabled(True) if index.sibling(index.row(), 4).data() == 1: if not self.cb_pracownik.checkState(): self.cb_pracownik.toggle() else: if self.cb_pracownik.checkState(): for value in self.pola: value.setText('') self.cb_pracownik.toggle() if self.cb_pracownik.checkState(): query = 'SELECT * FROM godziny WHERE uzytkownik_id = %s' val = (self.id_modify, ) wynik = query_to_db(query, val) for i, value in enumerate(self.pola, 2): if wynik: value.setText(str(wynik[i])) else: value.setText('') @pyqtSlot(str) def searching(self, text): """ Wyszukuje po wszystkich kolumnach tabeli :param text: """ search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp) self.proxy.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy.setFilterKeyColumn(-1)
class MyWindow(QMainWindow): def __init__(self): super(MyWindow, self).__init__() self.lz = [] self.ts = 0 self.zahlenListe = [] dir = os.path.dirname(sys.argv[0]) self.settingsfile = "%s/%s" % (dir, "Lotto.conf") self.zahlen = "%s/%s" % (dir, "zahlen.txt") print(self.settingsfile) self.settings = QSettings(self.settingsfile, QSettings.IniFormat) self.setStyleSheet(stylesheet(self)) self.lottolink = 'https://www.dielottozahlende.net/lotto-6-aus-49' self.mysuper = 5 self.model = QStandardItemModel(self) self.model.setRowCount(7) self.tableview = QTableView(self) self.tableview.setSortingEnabled(False) self.tableview.setGridStyle(1) if int(sys.version[0]) > 2: self.tableview.setFixedHeight(149) else: self.tableview.setFixedHeight(171) self.tableview.setSizeAdjustPolicy(QAbstractScrollArea.AdjustIgnored) self.tableview.horizontalHeader().setStretchLastSection(True) self.tableview.verticalHeader().setStretchLastSection(False) self.tableview.setCornerButtonEnabled(True) self.tableview.setShowGrid(True) self.tableview.setModel(self.model) self.tableview.hideRow(6) self.tableview.hideColumn(13) self.pushButtonLoad = QPushButton() self.pushButtonLoad.setText("Zahlen holen") self.pushButtonLoad.setIcon(QIcon.fromTheme("view-refresh")) self.pushButtonLoad.clicked.connect(self.getLotto) self.pushButtonLoad.setFixedWidth(110) self.pushButtonLoad.setFixedHeight(24) self.zahlenAction = QAction(QIcon.fromTheme("edit"), "Editor", self, triggered=self.edit_Tipps, shortcut="F5") self.addAction(self.zahlenAction) self.superAction = QAction(QIcon.fromTheme("edit"), "Superzahl", self, triggered=self.setMySuper, shortcut="F6") self.addAction(self.superAction) self.infoAction = QAction(QIcon.fromTheme("help-info"), "Information", self, triggered=self.showInfo, shortcut="F1") self.addAction(self.infoAction) self.lbl = QLabel() self.hbox = QHBoxLayout() self.hbox.addWidget(self.pushButtonLoad) grid = QVBoxLayout() grid.setSpacing(10) grid.addLayout(self.hbox) grid.addWidget(self.tableview) grid.addWidget(self.lbl) mywidget = QWidget() mywidget.setLayout(grid) self.setCentralWidget(mywidget) self.readSettings() self.tableview.resizeColumnsToContents() self.tableview.resizeRowsToContents() self.setHeaders() print("Wilkommen bei Lotto") self.statusBar().showMessage( "%s %s" % ("Willkommen bei LottoCheck", " *** F5 Lottozahlen ändern *** F6 Superzahl ändern"), 0) def findTableItems(self): model = self.tableview.model() self.tableview.selectionModel().clearSelection() print(self.zahlenListe) for column in range(12): start = model.index(0, column) for zahl in self.zahlenListe: matches = model.match(start, Qt.DisplayRole, str(zahl), 1, Qt.MatchExactly) if matches: index = matches[0] self.tableview.selectionModel().select( index, QItemSelectionModel.Select) def saveNumbers(self): print(self.model.columnCount(), "Columns") textData = "" fileName, _ = QFileDialog.getSaveFileName(self, "Open File", "~/lottozahlen.csv", "CSV Files (*.csv)") if fileName: print("%s %s" % (fileName, "saved")) f = open(fileName, 'w') for col in range(self.model.columnCount()): textData += str(self.model.horizontalHeaderItem(col).text()) textData += "\t" textData += "\n" for row in range(self.model.rowCount() - 1): for col in range(self.model.columnCount()): textData += str(self.model.data(self.model.index(row, col))) textData += "\t" textData += "\n" f.write(textData) f.close() def edit_Tipps(self): self.edWin = Editor() with open(self.zahlen, 'r') as f: text = f.read() self.edWin.tipp_editor.setPlainText(text) f.close() self.edWin.isModified = False def showInfo(self): link = "<p><a title='Axel Schneider' href='http://goodoldsongs.jimdo.com' target='_blank'> \ Axel Schneider</a></p>" message = "<h2>LottoCheck 1.0</h2><h4>6 aus 49</h4>created by " + link + " with PyQt5<br>©September 2019<br>" \ + "<br>Copyright © 2017 The Qt Company Ltd and other contributors." \ + "<br>Qt and the Qt logo are trademarks of The Qt Company Ltd." \ + "<br><br>F5 = Tipps ändern" \ + "<br>F6 = Superzahl ändern" self.msgbox(message) def msgbox(self, message): msg = QMessageBox(1, "Information", message, QMessageBox.Ok) msg.exec_() def getLotto(self): if not self.lz == []: print("values already here", self.lz) self.compare() else: self.lottolink = "https://www.lotto.de/lotto-6aus49/lottozahlen" print("getting Values") source = requests.get(self.lottolink).text soup = bsoup(source, 'lxml') lottoliste = [] for td in soup.find_all(class_='LottoBall__circle'): lottoliste.append(td.text) result = lottoliste self.zahlenListe = result[:6] self.lz = result theSuper = lottoliste[6] print("Gewinnzahlen:\n", self.zahlenListe) self.ts = theSuper print("theSuper", self.ts) for i in range(6): self.model.setData(self.model.index(i, 12), result[i]) self.model.item(i, 12).setTextAlignment(Qt.AlignCenter) self.compare() def getSpiel77(self): self.lottolink = "https://www.lotto.de/lotto-6aus49/lottozahlen" source = requests.get(self.lottolink).text soup = bsoup(source, 'lxml') result = soup.find(class_='WinningNumbersAdditionalGame__text').text print("Spiel 77: ", result) super6 = soup.find(class_='WinningNumbersAdditionalGame__text' ).parent.find_next_siblings()[0].text print("Super 6: ", super6) date = soup.find(class_="WinningNumbers__date").text self.lbl.setText(self.lbl.text() + "\n" + date + "\n\n" + result.replace("Spiel 77", "Spiel 77: ") + "\n" + super6.replace("Super 6", "Super 6: ")) def compare(self): ### compare all tipps print("self.lz: ", self.lz) self.lz = [int(x) for x in self.lz[:6]] print(self.mysuper, self.lz) self.lbl.clear() tipp = [] for x in range(len(self.tliste)): t = [] tipp = [int(x) for x in self.tliste[x]] # print(tipp) for a in self.lz: if int(a) in tipp: print(a, "in tipp", str(x + 1)) t.append(a) rtext = "" print("len(t) ", len(t)) if len(t) == 2 and self.mysuper == self.ts: rtext += self.lbl.text() rtext += '\ngewonnen in Tipp ' rtext += str(int(x) + 1) rtext += " : " rtext += str(t) rtext += " *** " rtext += str(len(t)) rtext += "er ***" rtext += ' + Superzahl' self.lbl.setText(rtext) elif len(t) > 2: if self.mysuper == self.ts: rtext += self.lbl.text() rtext += '\ngewonnen in Tipp ' rtext += str(int(x) + 1) rtext += " : " rtext += str(t) rtext += " *** " rtext += str(len(t)) rtext += "er ***" rtext += ' + Superzahl' self.lbl.setText(rtext) else: rtext += self.lbl.text() rtext += '\ngewonnen in Tipp ' rtext += str(int(x) + 1) rtext += " : " rtext += str(t) rtext += " *** " rtext += str(len(t)) rtext += "er ***" self.lbl.setText(rtext) if self.lbl.text() == "": self.lbl.setText("leider nichts gewonnen ...\n") self.statusBar().showMessage( "%s %s %s %s" % ("Gewinnzahlen: ", (', '.join(str(x) for x in self.lz)), " *** Superzahl: ", str(self.ts)), 0) self.getSpiel77() self.findTableItems() def setHeaders(self): self.tableview.horizontalHeader().setVisible(True) self.tableview.verticalHeader().setVisible(False) for x in range(self.model.columnCount() - 1): self.model.setHeaderData(x, Qt.Horizontal, "%s %s" % ("Tipp", (x + 1))) self.model.setHeaderData(self.model.columnCount() - 1, Qt.Horizontal, "Gewinnzahlen") self.tableview.setAlternatingRowColors(True) self.tableview.resizeColumnsToContents() self.tableview.resizeRowsToContents() def closeEvent(self, event): print("Goodbye ...") self.writeSettings() def setMySuper(self): s = int(self.mysuper) dlg = QInputDialog() ms, ok = dlg.getInt(self, 'Superzahl:', "", s, 0, 9, 1, Qt.Dialog) if ok: self.mysuper = ms print("Superzahl =", self.mysuper) def readSettings(self): if self.settings.contains("mysuper"): self.mysuper = self.settings.value("mysuper") else: self.setMySuper() print("Superzahl:", self.mysuper) self.tliste = [] with open(self.zahlen, 'r') as f: text = f.read() f.close() for line in text.splitlines(): self.tliste.append(line.split(",")) self.model.setColumnCount(len(self.tliste) + 1) for x in range(0, len(self.tliste)): tipp = self.tliste[x] for i in range(len(tipp)): self.model.setData(self.model.index(i, x), tipp[i]) self.model.item(i, x).setTextAlignment(Qt.AlignCenter) def writeSettings(self): self.settings.setValue("mysuper", self.mysuper)
class Materials(QWidget): def __init__(self): super().__init__() self.initUi() def initUi(self): self.setObjectName("Main window") self.resize(370, 300) self.setWindowTitle("Материалы") self.btn_add = QPushButton(self) self.btn_add.setObjectName("btn_add") self.btn_add.setText("Добавить") self.btn_delete = QPushButton(self) self.btn_delete.setObjectName("btn_delete") self.btn_delete.setText("Удалить") self.btn_exit = QPushButton(self) self.btn_exit.setObjectName("btn_exit") self.btn_exit.setText("Выход") self.btn_refresh = QPushButton(self) self.btn_refresh.setText("Обновить") self.db = QSqlDatabase.addDatabase('QSQLITE') self.db.setDatabaseName('ocenka.db') self.db.open() self.model = QSqlRelationalTableModel(self) self.model.setTable("v_materials") self.model.setEditStrategy(QSqlRelationalTableModel.OnFieldChange) self.model.setJoinMode(QSqlRelationalTableModel.LeftJoin) self.model.setHeaderData(0, Qt.Horizontal, "Идентификатор") self.model.setHeaderData(1, Qt.Horizontal, "Наименование") self.model.setHeaderData(2, Qt.Horizontal, "Ед.изм.") self.model.setHeaderData(3, Qt.Horizontal, "Количество") self.model.setHeaderData(4, Qt.Horizontal, "Стоимость") self.model.setHeaderData(5, Qt.Horizontal, "Сумма") self.model.setHeaderData(6, Qt.Horizontal, "Выбрать") #self.proxyModel = QSortFilterProxyModel(self) #self.proxyModel.setSourceModel(self.model) self.view = QTableView(self) self.view.setSortingEnabled(True) self.view.setModel(self.model) self.view.resizeColumnsToContents() self.view.hideColumn(0) self.view.horizontalHeader().setStretchLastSection(True) #self.view.hideColumn(1) self.view.setItemDelegate(QSqlRelationalDelegate(self.model)) self.model.select() self.layout = QHBoxLayout() self.layout.addWidget(self.btn_add) self.layout.addWidget(self.btn_delete) self.layout.addWidget(self.btn_exit) self.layout.addWidget(self.btn_refresh) vlayout = QVBoxLayout() vlayout.addWidget(self.view) vlayout.addLayout(self.layout) self.setLayout(vlayout) self.show() self.view.clicked.connect(self.findrow) self.btn_add.clicked.connect(self.addrow) self.btn_delete.clicked.connect(lambda: self.model.removeRow(self.view.currentIndex().row())) self.btn_exit.clicked.connect(self.close_event) self.btn_refresh.clicked.connect(lambda: self.model.select()) def close_database(self): self.view.setModel(None) del self.model self.db.close() del self.db QSqlDatabase.removeDatabase('ocenka.db') self.close() def close_event(self, event): self.close_database() def findrow(self, i): delrow = i.row() def addrow(self): print(self.model.rowCount()) ret = self.model.insertRows(self.model.rowCount(), 1) return ret
Qt.DisplayRole) == 0: return QBrush(Qt.red) elif QSqlQueryModel.data(self, self.index(item.row(), 4), Qt.DisplayRole) == 1: return QBrush(Qt.yellow) elif QSqlQueryModel.data(self, self.index(item.row(), 4), Qt.DisplayRole) == 2: return QBrush(Qt.green) return QSqlQueryModel.data(self, item, role) if __name__ == '__main__': import sys app = QApplication(sys.argv) if not createConnection(): sys.exit(1) model = CustomSqlModel() view = QTableView() view.resizeColumnsToContents() view.setModel(model) view.setWindowTitle("List") view.hideColumn(0) view.hideColumn(1) view.hideColumn(4) view.setColumnWidth(2, 300) view.setColumnWidth(3, 300) view.resize(650, 500) view.show() sys.exit(app.exec_())
class Customer(QWidget): """ Klasa odpowiedzialna za widget klienci """ def __init__(self, parent, db): super(QWidget, self).__init__(parent) self.parent = parent self.btn_usun = QPushButton('Usuń') self.btn_mod = QPushButton('Modyfikuj') self.txt_imie = QLineEdit() self.txt_nazwisko = QLineEdit() self.txt_email = QLineEdit() self.txt_tel = QLineEdit() self.txt_ulica = QLineEdit() self.txt_nr_dom = QLineEdit() self.txt_kod = QLineEdit() self.txt_miasto = QLineEdit() self.proxy = QSortFilterProxyModel(self) self.view = QTableView() # Parametry połączenia z bazą self.model = QSqlTableModel(self, db) self.id_modify = -1 self.initUI() def initUI(self): """ Inicjuje UI """ self.table_init() self.btn_usun.setDisabled(True) self.btn_mod.setDisabled(True) # Walidacja self.txt_kod.setInputMask('99-999') # Tworzenie kontrolek lbl_wyszukaj = QLabel('Wyszukaj klienta:') txt_wysz = QLineEdit(self) btn_dodaj = QPushButton('Dodaj') lbl_1 = QLabel('Imię:') lbl_2 = QLabel('Nazwisko:') lbl_3 = QLabel('Email:') lbl_4 = QLabel('Telefon:') lbl_5 = QLabel('Ulica:') lbl_6 = QLabel('Numer domu:') lbl_7 = QLabel('Kod pocztowy:') lbl_8 = QLabel('Miejscowość:') # Tworzenie widoków centralbox = QVBoxLayout() hbox_wysz = QHBoxLayout() gropubox = QGroupBox('Edycja danych klienta') grop_layout = QGridLayout() hbox_btn = QHBoxLayout() form_left = QFormLayout() form_right = QFormLayout() # Metody self.view.clicked.connect(self.change) btn_dodaj.clicked.connect(self.add) self.btn_mod.clicked.connect(self.modify) self.btn_usun.clicked.connect(self.remove) txt_wysz.textChanged.connect(self.searching) # Ustawianie widoków hbox_wysz.addWidget(lbl_wyszukaj) hbox_wysz.addWidget(txt_wysz) hbox_btn.addWidget(self.btn_usun) hbox_btn.addWidget(self.btn_mod) hbox_btn.addWidget(btn_dodaj) form_left.setSpacing(9) form_right.setSpacing(9) form_left.setContentsMargins(0, 0, 10, 0) form_right.setContentsMargins(10, 0, 0, 0) form_left.addRow(lbl_1, self.txt_imie) form_left.addRow(lbl_2, self.txt_nazwisko) form_left.addRow(lbl_3, self.txt_email) form_left.addRow(lbl_4, self.txt_tel) form_right.addRow(lbl_5, self.txt_ulica) form_right.addRow(lbl_6, self.txt_nr_dom) form_right.addRow(lbl_7, self.txt_kod) form_right.addRow(lbl_8, self.txt_miasto) grop_layout.addItem(form_left, 0, 0) grop_layout.addItem(form_right, 0, 1) gropubox.setLayout(grop_layout) centralbox.addLayout(hbox_wysz) centralbox.addWidget(self.view) centralbox.addWidget(gropubox) centralbox.addLayout(hbox_btn) self.setLayout(centralbox) self.show() def change(self): """ Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola """ index = (self.view.selectionModel().currentIndex()) value = index.sibling(index.row(), index.column()).data() self.id_modify = index.sibling(index.row(), 0).data() self.txt_imie.setText(index.sibling(index.row(), 1).data()) self.txt_nazwisko.setText(str(index.sibling(index.row(), 2).data())) self.txt_email.setText(index.sibling(index.row(), 3).data()) self.txt_tel.setText(index.sibling(index.row(), 4).data()) self.txt_ulica.setText(index.sibling(index.row(), 5).data()) self.txt_nr_dom.setText(index.sibling(index.row(), 6).data()) self.txt_miasto.setText(index.sibling(index.row(), 7).data()) self.txt_kod.setText(index.sibling(index.row(), 8).data()) if self.id_modify >= 0 and self.txt_imie.text( ) and self.txt_nazwisko.text(): self.btn_mod.setEnabled(True) self.btn_usun.setEnabled(True) else: self.btn_usun.setDisabled(True) self.btn_mod.setDisabled(True) value.setText('') def table_init(self): """ Inicjuje wygląd tabeli """ self.model.setTable('klienci') query = QSqlQuery( 'SELECT klienci_id, imie, nazwisko, email, telefon, ulica, numer_mieszkania, miejscowosc, poczta FROM ' 'klienci;') self.model.setQuery(query) self.proxy.setSourceModel(self.model) naglowki = { 'klienci_id': 'ID', 'imie': 'Imię', 'nazwisko': 'Nazwisko', "email": 'Email', 'telefon': 'Telefon', 'ulica': 'Ulica', 'numer_mieszkania': 'Numer mieszkania', 'miejscowosc': 'Miejscowosc', 'poczta': 'Kod pocztowy', } # Ustawianie nagłówków ilosc_kolumn = self.model.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model.headerData(i, Qt.Horizontal) self.model.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view.setSortingEnabled(True) self.view.setAlternatingRowColors(True) # Wczytanie danych self.view.setModel(self.proxy) self.view.hideColumn(0) self.view.sortByColumn(1, Qt.AscendingOrder) self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) def if_checked(self, txt, q, val=None): """ Sprawdza poprawność wprowadzonych damych. :param val: wartości do zapytania :param q: zapytanie query MySql :param txt: komunikat """ if len(self.txt_imie.text()) < 3 or len(self.txt_nazwisko.text()) < 1: msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setText(txt) msg.setWindowTitle("Popraw dane") msg.exec_() return False else: print('Trwa zmiana w bazie danych') if val: print('Połączenie') query_to_db(q, val) else: print('Transakcja') return transaction_to_db(q) return True def add(self): """ Dodaje nowego klienta do bazy danych i odświeża widok. """ tekst = 'Nie wprowadzono wszystkich danych' # Dodanie nowego użytkownika query = 'INSERT INTO klienci (imie, nazwisko, email, telefon, ulica, numer_mieszkania, miejscowosc, ' \ 'poczta) VALUES (%s, %s, %s, %s, %s, %s, %s, %s);' val = (self.txt_imie.text(), self.txt_nazwisko.text(), self.txt_email.text(), self.txt_tel.text(), self.txt_ulica.text(), self.txt_nr_dom.text(), self.txt_miasto.text(), self.txt_kod.text()) if self.if_checked(tekst, query, val): msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Klient został dodany do bazy danych') msg.setWindowTitle("Dodano nowego klienta") msg.exec_() # Odświeżanie widoku tabeli self.model.select() self.view.reset() def modify(self): """ Modyfikuje bazę danych """ tekst = 'Nie wprowadzono wszystkich danych' # Dodanie nowego użytkownika query = 'UPDATE klienci SET imie = %s, nazwisko = %s, email = %s, telefon = %s, ulica = %s, ' \ 'numer_mieszkania = %s, miejscowosc = %s, poczta = %s WHERE klienci_id = %s;' val = (self.txt_imie.text(), self.txt_nazwisko.text(), self.txt_email.text(), self.txt_tel.text(), self.txt_ulica.text(), self.txt_nr_dom.text(), self.txt_miasto.text(), self.txt_kod.text(), self.id_modify) if self.if_checked(tekst, query, val): msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Dane klienta zostały pomyślnie zmodyfikowane') msg.setWindowTitle("Dane klienta zostały zmodyfikowane") msg.exec_() # Odświeżanie widoku tabeli self.model.select() self.view.reset() def remove(self): """ Usuwa klientów z bazy danych """ test = 'Błąd! Nie można usunąć danej usługi!' query = 'DELETE FROM klienci WHERE klienci_id = %s' query1 = 'DELETE FROM wizyty WHERE klienci_id = %s' val = (self.id_modify, ) ret = QMessageBox.question( self, 'Usuwanie klienta', "Czy na pewno chcesz usunąć danego klienta?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if ret == QMessageBox.Yes: if self.if_checked(test, [(query1, val), (query, val)]): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText('Klient został usunięty') msg.setWindowTitle("Usunięto") msg.exec_() self.txt_imie.setText('') self.txt_nazwisko.setText(''), self.txt_email.setText(''), self.txt_tel.setText(''), self.txt_ulica.setText(''), self.txt_nr_dom.setText(''), self.txt_miasto.setText(''), self.txt_kod.setText('') # Odświeżanie widoku tabeli self.model.select() self.view.reset() @pyqtSlot(str) def searching(self, text): """ Wyszukuje po wszystkich kolumnach tabeli :param text: """ search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp) self.proxy.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy.setFilterKeyColumn(-1)
class PBox(QWidget): def __init__(self): super().__init__() self.label1 = QLabel('Machine Production',self) #====##====##====##====##====# #SESSION EXTRACTION TO TABLE #====##====##====##====##====# #UNCOMMENT FOR FINAL PRODUCT # db = QSqlDatabase.database("pbox") #Development product - Please turn on to edit widget alone. db = QSqlDatabase.addDatabase("QSQLITE") db.setDatabaseName("complete.db") db.open() #Session instance creation #Extract all orders in the procedure queue # self.table.setHorizontalHeaderItem(0, QTableWidgetItem('Order No. /订单号')) # self.table.setHorizontalHeaderItem(1, QTableWidgetItem('Model/型号')) # self.table.setHorizontalHeaderItem(2, QTableWidgetItem('Quantity / 数量 ')) # self.table.setHorizontalHeaderItem(3, QTableWidgetItem('Order Date / 订单日期')) ''' Use QHeader Class to resize the tables ''' # Iterating through all records # self.setData(self.all_orders) self.model = QSqlTableModel(self, db) self.model.setTable("productionqueue") self.model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.model.select() self.tableview = QTableView() self.tableview.setModel(self.model) self.tableview.hideColumn(0) self.order_header = self.tableview.horizontalHeader() self.order_header.setMinimumSectionSize(130) self.order_header.setSectionResizeMode(QHeaderView.Stretch) self.tableview.setSelectionBehavior(QAbstractItemView.SelectRows) #self.tableview.setCurrentCell(-1,-1) print(self.tableview.rowAt(1)) self.select = self.tableview.selectionModel() print('Current index: ', self.tableview.selectRow(-1)) print ('Selected: ',self.select.selectedRows()) print ('has selection: ', self.select.hasSelection()) #====##====##====##====##====# #CONTROL PANEL #====##====##====##====##====# self.btn_neworder = QPushButton('New / 加单', self) self.btn_neworder.clicked.connect(self.getDBox) self.btn_deleterecord = QPushButton('Delete / 取消', self) self.btn_deleterecord.clicked.connect(self.deleteRecord) #====##====##====##====##====# #Layout forming #====##====##====##====##====# self.vBox = QVBoxLayout() #Adding tableview into VBoxLayout self.tableBox = QGridLayout() self.tableBox.addWidget(self.tableview) self.controlBox = QHBoxLayout() self.controlBox.addWidget(self.btn_neworder) self.controlBox.addWidget(self.btn_deleterecord) self.vBox.addWidget(self.label1) self.vBox.addLayout(self.tableBox) self.vBox.addLayout(self.controlBox) self.setLayout(self.vBox) self.setGeometry(0,0,640,440) self.show() #====##====##====##====##====# #CONTROL PANEL #====##====##====##====##====# ''' getDBox: Brings up the Dialog Box from dialog_new ''' def getDBox(self) : dbox = DBox() dbox.exec() if dbox.oq_input.text(): # print ('number of rows: ', self.model.rowCount()) # print(dbox.new_record) self.model.insertRecord(self.model.rowCount(),dbox.new_record) self.model.submitAll() dbox.new_record = -1 ''' deleteRecord: - removes both from the view and the database ''' def deleteRecord(self): if self.select.hasSelection(): qmodelindex = self.select.selectedRows()[0] row = qmodelindex.row() self.model.removeRows(row,1) self.model.submitAll()
class IBox(QWidget): def __init__(self): super().__init__() #====##====##====##====##====##====##====# # QSqlModel connecition #====##====##====##====##====##====##====# # self.db = QSqlDatabase.database("ibox") self.db = QSqlDatabase.addDatabase("QSQLITE") self.db.setDatabaseName("complete.db") self.db.open() self.inv_model = QSqlTableModel(self, self.db) self.inv_model.setTable("models") self.inv_model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.inv_model.select() self.inv_view = QTableView() self.inv_view.setModel(self.inv_model) self.inv_view.hideColumn(0) self.inv_view.hideColumn(2) self.order_header = self.inv_view.horizontalHeader() self.order_header.setMinimumSectionSize(130) self.order_header.setSectionResizeMode(QHeaderView.Stretch) self.inv_view.setSelectionBehavior(QAbstractItemView.SelectRows) self.bargraph = PlotCanvas(self, width=4, height=3) #self.bargraph.move(0,0) #====##====##====##====##====# #Layout forming & finalization #====##====##====##====##====# iboxlayout = QHBoxLayout() iboxlayout.addWidget(self.inv_view) iboxlayout.addWidget(self.bargraph) self.setLayout(iboxlayout) # self.setStyleSheet('background-color: #444444') self.setWindowTitle('JPro') self.setGeometry(0, 0, 640, 440) self.show() def setData(self, data): row = 0 for record in data: self.table.setItem(row, 0, QTableWidgetItem(str(record.name))) self.table.setItem(row, 1, QTableWidgetItem(str(record.current_quantity))) # self.table.setItem(row, 2, QTableWidgetItem(record.parts)) row += 1 def buildTable(self): self.table = QTableWidget(len(self.all_stock), 2, self) self.table.setHorizontalHeaderItem(0, QTableWidgetItem('Models / 模型 ')) self.table.setHorizontalHeaderItem(1, QTableWidgetItem('Quantity / 数量 ')) # self.table.setHorizontalHeaderItem(2, QTableWidgetItem('Parts / 零件')) self.order_header = self.table.horizontalHeader() self.order_header.setMinimumSectionSize(130) self.order_header.setSectionResizeMode(QHeaderView.Stretch) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.setCurrentCell(-1, -1)
class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) self.box = BoxHelper() self.box.update_thread.startThread.connect(self.startUpdate) self.box.update_thread.endThread.connect(self.endUpdate) self.db = MusicDB() self.query = QSqlQuery() self.player = MyPlayer() self.player.player.mediaStatusChanged.connect(self.qmp_mediaStatusChanged) self.player.player.stateChanged.connect(self.qmp_stateChanged) self.player.player.positionChanged.connect(self.qmp_positionChanged) self.player.player.volumeChanged.connect(self.qmp_volumeChanged) self.player.currentIndexChanged.connect(self.playlistIdxChanged) self.playlist = {} self.setFixedWidth(900) self.setFixedHeight(600) layout = QVBoxLayout() hlayout = QHBoxLayout() hlayout2 = QHBoxLayout() self.labelCover = QLabel() self.labelCover.setFixedWidth(200) self.labelCover.setFixedHeight(200) hlayout2.addWidget(self.labelCover) vlayout2 = QVBoxLayout() vlayout2.addStretch() self.labelTitle = QLabel() self.labelTitle.setWordWrap(True) vlayout2.addWidget(self.labelTitle) self.labelAlbum = QLabel() self.labelAlbum.setWordWrap(True) vlayout2.addWidget(self.labelAlbum) self.labelArtist = QLabel() self.labelArtist.setWordWrap(True) self.labelArtist.setFixedWidth(300) vlayout2.addWidget(self.labelArtist) vlayout2.addStretch() hlayout2.addLayout(vlayout2) controlArea = QVBoxLayout() seekSliderLayout = QHBoxLayout() controls = QHBoxLayout() playlistCtrlLayout = QHBoxLayout() #creating buttons pixmap = QPixmap("pause-play-button.png") buttonIcon = QIcon(pixmap) self.pauseBtn = QPushButton() self.pauseBtn.setIcon(buttonIcon) self.pauseBtn.setIconSize(pixmap.rect().size()) pixmap = QPixmap("stop-button.png") buttonIcon = QIcon(pixmap) self.stopBtn = QPushButton() self.stopBtn.setIcon(buttonIcon) self.stopBtn.setIconSize(pixmap.rect().size()) pixmap = QPixmap("volumedown-button.png") buttonIcon = QIcon(pixmap) self.volumeDescBtn = QPushButton() self.volumeDescBtn.setIcon(buttonIcon) self.volumeDescBtn.setIconSize(pixmap.rect().size()) pixmap = QPixmap("volumeup-button.png") buttonIcon = QIcon(pixmap) self.volumeIncBtn = QPushButton() self.volumeIncBtn.setIcon(buttonIcon) self.volumeIncBtn.setIconSize(pixmap.rect().size()) self.progress = QProgressBar() self.progress.setRange(0, 100) self.progress.setTextVisible(True) self.progress.setValue(self.player.player.volume()) #creating playlist controls pixmap = QPixmap("previous-track-button.png") buttonIcon = QIcon(pixmap) self.prevBtn = QPushButton() self.prevBtn.setIcon(buttonIcon) self.prevBtn.setIconSize(pixmap.rect().size()) vlayout3 = QVBoxLayout() self.labelPlaylist = QLabel() self.labelPlaylist.setAlignment(Qt.AlignCenter) self.labelPlaylist.setText("No Songs") vlayout3.addWidget(self.labelPlaylist) pixmap = QPixmap("playlist-button.png") buttonIcon = QIcon(pixmap) self.playlistBtn = QPushButton() self.playlistBtn.setIcon(buttonIcon) self.playlistBtn.setIconSize(pixmap.rect().size()) self.playlistBtn.setCheckable(True) vlayout3.addWidget(self.playlistBtn) pixmap = QPixmap("next-track-button.png") buttonIcon = QIcon(pixmap) self.nextBtn = QPushButton() self.nextBtn.setIcon(buttonIcon) self.nextBtn.setIconSize(pixmap.rect().size()) #creating seek slider self.seekSlider = QSlider() self.seekSlider.setMinimum(0) self.seekSlider.setMaximum(100) self.seekSlider.setOrientation(Qt.Horizontal) self.seekSlider.setTracking(False) self.seekSlider.sliderMoved.connect(self.seekPosition) #self.seekSlider.valueChanged.connect(self.seekPosition) self.seekSliderLabel1 = QLabel('0.00') self.seekSliderLabel2 = QLabel('0.00') seekSliderLayout.addWidget(self.seekSliderLabel1) seekSliderLayout.addWidget(self.seekSlider) seekSliderLayout.addWidget(self.seekSliderLabel2) #Add handler for each button. Not using the default slots. self.pauseBtn.clicked.connect(self.play) self.stopBtn.clicked.connect(self.player.stopHandler) self.volumeDescBtn.clicked.connect(self.player.decreaseVolume) self.volumeIncBtn.clicked.connect(self.player.increaseVolume) #Adding to the horizontal layout controls.addWidget(self.volumeDescBtn) controls.addWidget(self.pauseBtn) controls.addWidget(self.stopBtn) controls.addWidget(self.volumeIncBtn) #playlist control button handlers self.prevBtn.clicked.connect(self.player.prevItemPlaylist) self.nextBtn.clicked.connect(self.player.nextItemPlaylist) self.playlistBtn.clicked.connect(self.showPlaylist) playlistCtrlLayout.addWidget(self.prevBtn) playlistCtrlLayout.addLayout(vlayout3) playlistCtrlLayout.addWidget(self.nextBtn) #Adding to the vertical layout controlArea.addLayout(seekSliderLayout) controlArea.addLayout(controls) controlArea.addWidget(self.progress) controlArea.addLayout(playlistCtrlLayout) hlayout2.addLayout(controlArea) layout.addLayout(hlayout2) self.stack = QStackedWidget() self.view = QTableView() self.view.setSelectionBehavior(QAbstractItemView.SelectRows) self.proxy = MyProxyModel() self.proxy.setSourceModel(self.db.model) self.view.setModel(self.proxy) self.view.hideColumn(0) self.view.hideColumn(4) self.view.hideColumn(5) self.view.hideColumn(6) self.view.hideColumn(7) self.view.hideColumn(9) self.view.hideColumn(10) self.view.hideColumn(11) self.view.selectionModel().selectionChanged.connect(self.viewSelection) self.view.setContextMenuPolicy(Qt.CustomContextMenu) self.view.customContextMenuRequested.connect(self.contextMenuEvent) self.view.resizeColumnsToContents() self.view.horizontalHeader().setStretchLastSection(True) self.view.setSortingEnabled(True) self.view.verticalHeader().setVisible(False) self.stack.addWidget(self.view) self.viewpl = QListView() self.modelpl = QStandardItemModel() self.viewpl.setModel(self.modelpl) self.stack.addWidget(self.viewpl) layout.addWidget(self.stack) hlayout2 = QHBoxLayout() pixmap = QPixmap("search-button.png") buttonIcon = QIcon(pixmap) self.pushButton_2 = QPushButton() self.pushButton_2.setIcon(buttonIcon) self.pushButton_2.setIconSize(pixmap.rect().size()) hlayout2.addWidget(self.pushButton_2) self.lineEdit = QLineEdit() hlayout2.addWidget(self.lineEdit) layout.addLayout(hlayout2) # container = QWidget() container.setLayout(layout) self.setCentralWidget(container) # # self.status = QStatusBar() # self.setStatusBar(self.status) # # # Uncomment to disable native menubar on Mac self.menuBar().setNativeMenuBar(False) # # file_toolbar = QToolBar("File") # file_toolbar.setIconSize(QSize(14, 14)) # self.addToolBar(file_toolbar) file_menu = self.menuBar().addMenu("&File") add_file_action = QAction("Upload file...", self) #QIcon(os.path.join('images', 'blue-folder-open-document.png')), "Open file...", self) add_file_action.setStatusTip("Upload file") add_file_action.triggered.connect(self.addFile) file_menu.addAction(add_file_action) save_file_action = QAction("Remove file..", self) save_file_action.setStatusTip("Remove Selected File") save_file_action.triggered.connect(self.removeFile) file_menu.addAction(save_file_action) # # saveas_file_action = QAction(QIcon(os.path.join('images', 'disk--pencil.png')), "Save As...", self) # saveas_file_action.setStatusTip("Save current page to specified file") # saveas_file_action.triggered.connect(self.file_saveas) # file_menu.addAction(saveas_file_action) # file_toolbar.addAction(saveas_file_action) # # print_action = QAction(QIcon(os.path.join('images', 'printer.png')), "Print...", self) # print_action.setStatusTip("Print current page") # print_action.triggered.connect(self.file_print) # file_menu.addAction(print_action) # file_toolbar.addAction(print_action) # # edit_toolbar = QToolBar("Edit") # edit_toolbar.setIconSize(QSize(16, 16)) # self.addToolBar(edit_toolbar) # edit_menu = self.menuBar().addMenu("&Edit") # # undo_action = QAction(QIcon(os.path.join('images', 'arrow-curve-180-left.png')), "Undo", self) # undo_action.setStatusTip("Undo last change") # undo_action.triggered.connect(self.editor.undo) # edit_menu.addAction(undo_action) # # redo_action = QAction(QIcon(os.path.join('images', 'arrow-curve.png')), "Redo", self) # redo_action.setStatusTip("Redo last change") # redo_action.triggered.connect(self.editor.redo) # edit_toolbar.addAction(redo_action) # edit_menu.addAction(redo_action) # # edit_menu.addSeparator() # # cut_action = QAction(QIcon(os.path.join('images', 'scissors.png')), "Cut", self) # cut_action.setStatusTip("Cut selected text") # cut_action.setShortcut(QKeySequence.Cut) # cut_action.triggered.connect(self.editor.cut) # edit_toolbar.addAction(cut_action) # edit_menu.addAction(cut_action) # # copy_action = QAction(QIcon(os.path.join('images', 'document-copy.png')), "Copy", self) # copy_action.setStatusTip("Copy selected text") # cut_action.setShortcut(QKeySequence.Copy) # copy_action.triggered.connect(self.editor.copy) # edit_toolbar.addAction(copy_action) # edit_menu.addAction(copy_action) # # paste_action = QAction(QIcon(os.path.join('images', 'clipboard-paste-document-text.png')), "Paste", self) # paste_action.setStatusTip("Paste from clipboard") # cut_action.setShortcut(QKeySequence.Paste) # paste_action.triggered.connect(self.editor.paste) # edit_toolbar.addAction(paste_action) # edit_menu.addAction(paste_action) # # select_action = QAction(QIcon(os.path.join('images', 'selection-input.png')), "Select all", self) # select_action.setStatusTip("Select all text") # cut_action.setShortcut(QKeySequence.SelectAll) # select_action.triggered.connect(self.editor.selectAll) # edit_menu.addAction(select_action) self.setWindowTitle("Music DB") # self.setWindowIcon(QIcon('stemma.png')) self.show() #self.pushButton.clicked.connect(self.play) self.pushButton_2.clicked.connect(self.searchSong) @pyqtSlot('QPoint') def contextMenuEvent(self, pos): if self.view.selectionModel().selection().indexes(): for i in self.view.selectionModel().selection().indexes(): row, column = i.row(), i.column() menu = QMenu() updateAction = menu.addAction("Update Info") addAction = menu.addAction("Add to Playlist") newAction = menu.addAction("New Playlist") delAction = menu.addAction("Delete Playlist") action = menu.exec_(self.view.mapToGlobal(pos)) if action == addAction: self.addToPlayList(row, column, False) elif action == updateAction: self.updateInfo(row, column) elif action == newAction: self.addToPlaylist(row, column, True) elif action == delAction: self.delPlaylist() def delPlaylist(self): self.playlist = {} self.labelPlaylist.setText('No Songs') self.modelpl.clear() def addToPlayList(self, row, column, isnew): if isnew: self.delPlaylist() file_id = int(self.db.model.record(row).field(11).value()) link = self.box.url(file_id) self.playlist[link] = self.db.model.record(row) #txt = "{} - {}".format(self.db.model.record(row).field(1).value(), # self.db.model.record(row).field(3).value()) if len(self.playlist) == 1: self.labelPlaylist.setText('1 Song') else: self.labelPlaylist.setText('{} Songs'.format(len(self.playlist))) item = ComponentItem(self.db.model.record(row)) self.modelpl.appendRow(item) def updateInfo(self, row, column): pass @pyqtSlot() def searchSong(self): pattern = {'search':self.lineEdit.text()} self.db.model.setFilter("title like '%{search}%' or artist like '%{search}%' or album like '%{search}%'".format(**pattern)) @pyqtSlot() def startUpdate(self): self.w = QtWaitingSpinner(self) self.w.start() @pyqtSlot() def endUpdate(self): self.w.stop() QMessageBox.information(None, "File Upload", "File {} uploaded.".format(self.box.update_thread.new_filename)) @pyqtSlot() def addFile(self): filter = "(All Files (*);;MP3 (*.mp3);;M4A (*.m4a)" file_name = QFileDialog() file_name.setFileMode(QFileDialog.ExistingFiles) names = file_name.getOpenFileNames(None, "File Upload", "/Users/sani/Music", filter) if len(names[0]) != 0: for path in names[0]: self.box.upload(path) @pyqtSlot() def removeFile(self): if self.view.selectionModel().hasSelection(): row = self.view.selectionModel().currentIndex().row() file_id = int(self.db.model.record(row).field(11).value()) self.box.remove(file_id) self.db.removeFile(row) def changeView(self, record): self.labelTitle.setText("Title: {}".format(record.field(1).value())) self.labelArtist.setText("Artist: {}".format(record.field(3).value())) self.labelAlbum.setText("Album: {}".format(record.field(2).value())) filename = "covers/{}.jpg".format(record.field(0).value()) image = QPixmap(filename) if not image.isNull(): self.labelCover.setPixmap(image.scaled(self.labelCover.width(), self.labelCover.height(), Qt.KeepAspectRatio)) else: self.labelCover.setPixmap(QPixmap()) self.repaint() self.update() @pyqtSlot(QItemSelection, QItemSelection) def viewSelection(self, new, old): indices = new.indexes() if indices == []: return record = self.db.model.record(indices[0].row()) self.changeView(record) @pyqtSlot() def showPlaylist(self): if self.playlistBtn.isChecked(): self.stack.setCurrentIndex(1) if len(self.playlist) != 0: print ("song", self.player.currentSong) record = self.modelpl.item(self.player.currentSong).record self.changeView(record) else: self.stack.setCurrentIndex(0) if self.view.selectionModel().hasSelection(): row = self.view.selectionModel().currentIndex().row() print (row) self.changeView(self.db.model.record(row)) @pyqtSlot() def play(self): if self.player.userAction <= 0: if len(self.playlist) != 0: self.player.setPlaylist(self.playlist) elif self.view.selectionModel().hasSelection(): row = self.view.selectionModel().currentIndex().row() file_id = int(self.db.model.record(row).field(11).value()) link = self.box.url(file_id) self.player.playHandler(link) elif self.player.userAction == 1: self.player.pauseHandler() elif self.player.userAction == 2: self.player.playHandler() @pyqtSlot(int) def seekPosition(self, position): sender = self.sender() if isinstance(sender, QSlider): if self.player.player.isSeekable(): self.player.player.setPosition(position) # @pyqtSlot('qint64', bool) def qmp_positionChanged(self, position, senderType=False): if senderType == False: self.seekSlider.setValue(position) self.seekSliderLabel1.setText('%d:%02d'%(int(position/60000),int((position/1000)%60))) @pyqtSlot() def qmp_mediaStatusChanged(self): if self.player.player.mediaStatus() == QMediaPlayer.LoadedMedia and self.player.userAction == 1: durationT = self.player.player.duration() self.seekSlider.setRange(0, durationT) self.seekSliderLabel2.setText('%d:%02d'%(int(durationT/60000),int((durationT/1000)%60))) self.player.player.play() # FIXME FARE UNA FUNZIONE ???? if len(self.playlist) != 0: record = self.modelpl.item(self.player.currentSong).record else: if self.view.selectionModel().hasSelection(): row = self.view.selectionModel().currentIndex().row() #rate = record.field(8).value() #self.db.incrementPlayed() @pyqtSlot() def qmp_stateChanged(self): if self.player.player.state() == QMediaPlayer.StoppedState: self.player.player.stop() self.player.stopHandler() def qmp_volumeChanged(self): self.progress.setValue(self.player.player.volume()) @pyqtSlot(int, int) def playlistIdxChanged(self, old, new): if len(self.playlist) > 0: if old != -1: self.modelpl.item(old).selected = False if new != -1: self.modelpl.item(new).selected = True def closeEvent(self, event): reply = QMessageBox.question(self, 'Message', 'Are you sure ?', QMessageBox.Yes|QMessageBox.No, QMessageBox.Yes) if reply == QMessageBox.Yes : self.close() else: try: event.ignore() except AttributeError: pass
class Reservations(QWidget): """ Klasa odpowiedzialna za widget klienci """ def __init__(self, parent, db): super(QWidget, self).__init__(parent) self.parent = parent self.btn_mod = QPushButton('Zmiana statusu') self.btn_usun = QPushButton('Usuń') self.btn_dodaj = QPushButton('Dodaj') self.lbl_klient_ = QLabel('') self.lbl_usluga_ = QLabel('') self.lbl_termin_ = QDateTimeEdit() self.gb_layout = QVBoxLayout() self.kalendarz = QCalendarWidget() self.view_u = QTableView() self.view_k = QTableView() self.view_p = QTableView() self.view = QTableView() self.proxy_u = QSortFilterProxyModel(self) self.proxy_k = QSortFilterProxyModel(self) self.proxy_p = QSortFilterProxyModel(self) self.proxy = QSortFilterProxyModel(self) self.id_klient = -1 self.id_usluga = -1 self.id_pracownik = -1 self.id_rezerwacje = -1 self.data = None self.data_do = None self.dzien_tyg = 0 self.czas = [] # Lista składana przycisków godzin self.btn_godz = [QPushButton(str(i + 1)) for i in range(16)] # Parametry połączenia z bazą self.model_u = QSqlTableModel(self, db) self.model_k = QSqlTableModel(self, db) self.model_p = QSqlTableModel(self, db) self.model = QSqlTableModel(self, db) self.initUI() def initUI(self): """ Inicjuje UI """ self.view_u.setObjectName('Usługi') self.view_k.setObjectName('Klienci') self.view_p.setObjectName('Pracownicy') self.view.setObjectName('Rezerwacje') self.table_init_u() self.table_init_k() self.table_init_p() self.table_init() self.btn_mod.setDisabled(True) self.btn_usun.setDisabled(True) self.btn_dodaj.setDisabled(True) # Tworzenie kontrolek lbl_wysz_u = QLabel('Wyszukaj usługę:') lbl_wysz_k = QLabel('Wyszukaj klienta:') lbl_wysz_p = QLabel('Wyszukaj pracownika:') txt_wysz_u = QLineEdit(self) txt_wysz_k = QLineEdit(self) txt_wysz_p = QLineEdit(self) lbl_klient = QLabel('Klient:') lbl_usluga = QLabel('Usługa:') lbl_termin = QLabel('Termin:') sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.kalendarz.sizePolicy().hasHeightForWidth()) self.kalendarz.setSizePolicy(sizePolicy) # Tworzenie widoków centralbox = QHBoxLayout() hbox_wysz_u = QHBoxLayout() hbox_wysz_k = QHBoxLayout() hbox_wysz_p = QHBoxLayout() vbox_u = QVBoxLayout() vbox_k = QVBoxLayout() vbox_p = QVBoxLayout() vbox_right = QVBoxLayout() hbox_btn = QHBoxLayout() hbox_k = QHBoxLayout() hbox_u = QHBoxLayout() hbox_t = QHBoxLayout() vbox_cal = QVBoxLayout() groupbox = QGroupBox('Godziny:') groupbox.setLayout(self.gb_layout) hbox_left = QHBoxLayout() # Metody self.lbl_termin_.setCalendarWidget(self.kalendarz) self.lbl_termin_.setDate(self.kalendarz.selectedDate()) self.dzien_tyg = self.kalendarz.selectedDate().dayOfWeek() txt_wysz_u.textChanged.connect(self.searching_u) txt_wysz_k.textChanged.connect(self.searching_k) txt_wysz_p.textChanged.connect(self.searching_p) self.view_k.clicked.connect(lambda: self.clicked_table(self.view_k)) self.view_p.clicked.connect(lambda: self.clicked_table(self.view_p)) self.view_u.clicked.connect(lambda: self.clicked_table(self.view_u)) self.view.clicked.connect(lambda: self.clicked_table(self.view)) self.kalendarz.clicked.connect(self.show_data) self.btn_dodaj.clicked.connect(self.add) self.btn_mod.clicked.connect(self.modify) self.btn_usun.clicked.connect(self.remove) # Ustawianie widoków hbox_wysz_k.addWidget(lbl_wysz_k) hbox_wysz_k.addWidget(txt_wysz_k) hbox_wysz_p.addWidget(lbl_wysz_p) hbox_wysz_p.addWidget(txt_wysz_p) hbox_wysz_u.addWidget(lbl_wysz_u) hbox_wysz_u.addWidget(txt_wysz_u) vbox_u.addLayout(hbox_wysz_u) vbox_u.addWidget(self.view_u) vbox_k.addLayout(hbox_wysz_k) vbox_k.addWidget(self.view_k) vbox_p.addLayout(hbox_wysz_p) vbox_p.addWidget(self.view_p) vbox_right.addLayout(vbox_p) vbox_right.addLayout(vbox_u) vbox_right.addLayout(vbox_k) hbox_btn.addWidget(self.btn_usun) hbox_btn.addWidget(self.btn_mod) hbox_k.addWidget(lbl_klient) hbox_k.addWidget(self.lbl_klient_) hbox_u.addWidget(lbl_usluga) hbox_u.addWidget(self.lbl_usluga_) hbox_t.addWidget(lbl_termin) hbox_t.addWidget(self.lbl_termin_) vbox_cal.addWidget(self.kalendarz) vbox_cal.addLayout(hbox_u) vbox_cal.addLayout(hbox_t) vbox_cal.addLayout(hbox_k) self.view.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum)) vbox_cal.addWidget(self.view) vbox_cal.addLayout(hbox_btn) vbox_cal.addWidget(self.btn_dodaj) hbox_left.addLayout(vbox_cal) hbox_left.addWidget(groupbox) centralbox.addLayout(hbox_left) centralbox.addLayout(vbox_right) self.setLayout(centralbox) self.show() def show_data(self): self.lbl_termin_.setDate(self.kalendarz.selectedDate()) self.dzien_tyg = self.kalendarz.selectedDate().dayOfWeek() self.clicked_table(self.view_p) def table_init_u(self): """ Inicjuje wygląd tabeli usługi """ # self.model_u.setTable('uslugi') query = QSqlQuery( 'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, date_format(uslugi.czas, "%H:%i") AS czas FROM uslugi NATURAL JOIN uzytkownik_usluga WHERE uzytkownik_usluga.uzytkownik_id = ' + str(self.id_pracownik) + ';') self.model_u.setQuery(query) # self.model_u.select() self.proxy_u.setSourceModel(self.model_u) naglowki = { 'uslugi_id': 'ID', 'nazwa': 'Nazwa', 'cena': 'Cena', "czas": 'Czas', } # Ustawianie nagłówków ilosc_kolumn = self.model_u.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model_u.headerData(i, Qt.Horizontal) self.model_u.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view_u.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view_u.setSortingEnabled(True) self.view_u.setAlternatingRowColors(True) # Wczytanie danych self.view_u.setModel(self.proxy_u) self.view_u.hideColumn(0) self.view_u.sortByColumn(1, Qt.AscendingOrder) self.view_u.setEditTriggers(QAbstractItemView.NoEditTriggers) def table_init_k(self): """ Inicjuje wygląd tabeli klienta """ self.model_k.setTable('klienci') query = QSqlQuery( 'SELECT klienci_id, imie, nazwisko, email, telefon, ulica, numer_mieszkania, miejscowosc, poczta FROM ' 'klienci;') self.model_k.setQuery(query) # self.model_k.select() self.proxy_k.setSourceModel(self.model_k) naglowki = { 'klienci_id': 'ID', 'imie': 'Imię', 'nazwisko': 'Nazwisko', "email": 'Email', 'telefon': 'Telefon', 'ulica': 'Ulica', 'numer_mieszkania': 'Numer mieszkania', 'miejscowosc': 'Miejscowosc', 'poczta': 'Kod pocztowy', } # Ustawianie nagłówków ilosc_kolumn = self.model_k.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model_k.headerData(i, Qt.Horizontal) self.model_k.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view_k.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view_k.setSortingEnabled(True) self.view_k.setAlternatingRowColors(True) # Wczytanie danych self.view_k.setModel(self.proxy_k) self.view_k.hideColumn(0) self.view_k.sortByColumn(1, Qt.AscendingOrder) self.view_k.setEditTriggers(QAbstractItemView.NoEditTriggers) def table_init_p(self): """ Inicjuje wygląd tabeli pracownik """ self.model_p.setTable('uzytkownik') query = QSqlQuery( 'SELECT uzytkownik_id, imie, nazwisko FROM uzytkownik WHERE ' 'pracownik = 1;') self.model_p.setQuery(query) # self.model_p.select() self.proxy_p.setSourceModel(self.model_p) naglowki = { 'uzytkownik_id': 'ID', 'imie': 'Imię', "nazwisko": 'Nazwisko', } # Ustawianie nagłówków ilosc_kolumn = self.model_p.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model_p.headerData(i, Qt.Horizontal) self.model_p.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view_p.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view_p.setSortingEnabled(True) self.view_p.setAlternatingRowColors(True) # Wczytanie danych self.view_p.setModel(self.proxy_p) self.view_p.hideColumn(0) self.view_p.sortByColumn(1, Qt.AscendingOrder) self.view_p.setEditTriggers(QAbstractItemView.NoEditTriggers) def table_init(self): """ Inicjuje wygląd tabeli """ query = QSqlQuery( 'SELECT wizyty.wizyty_id, CONCAT(klienci.imie, " ", klienci.nazwisko) AS klient, uslugi.nazwa, ' 'wizyty.rezerwacja_od, wizyty.rezerwacja_do, wizyty.status FROM klienci, uslugi NATURAL JOIN wizyty WHERE wizyty.rezerwacja_od > CURRENT_TIMESTAMP AND wizyty.uzytkownik_id = ' + str(self.id_pracownik) + ';') self.model.setQuery(query) self.proxy.setSourceModel(self.model) naglowki = { 'wizyty_id': 'ID', 'klient': 'Klient', 'nazwa': 'Usługa', 'rezerwacja_od': 'Rezerwacja od', "rezerwacja_do": 'Rezerwacja do', 'status': 'Status rezerwacji' } # Ustawianie nagłówków ilosc_kolumn = self.model.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model.headerData(i, Qt.Horizontal) self.model.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) self.view.setSizeAdjustPolicy( QAbstractScrollArea.AdjustToContentsOnFirstShow) self.view.setSortingEnabled(True) self.view.setAlternatingRowColors(True) # Wczytanie danych self.view.setModel(self.proxy) self.view.hideColumn(0) self.view.sortByColumn(4, Qt.AscendingOrder) self.view.setEditTriggers(QAbstractItemView.NoEditTriggers) def clicked_table(self, view): """ Metoda edytująca zaznaczone wiersze - Wstawia wartości z wierszy w odpowiednie pola """ index = (view.selectionModel().currentIndex()) if view.objectName() == 'Klienci': self.id_klient = index.sibling(index.row(), 0).data() self.lbl_klient_.setText('<b>' + index.sibling(index.row(), 1).data() + ' ' + index.sibling(index.row(), 2).data() + '</b>') elif view.objectName() == 'Usługi': self.id_usluga = index.sibling(index.row(), 0).data() self.lbl_usluga_.setText('<b>' + index.sibling(index.row(), 1).data() + '</b>') self.data_do = index.sibling(index.row(), 3).data() elif view.objectName() == 'Rezerwacje': self.id_rezerwacje = index.sibling(index.row(), 0).data() if self.id_rezerwacje > 0: self.btn_mod.setEnabled(True) self.btn_usun.setEnabled(True) elif view.objectName() == 'Pracownicy': self.id_pracownik = index.sibling(index.row(), 0).data() self.czas = [] for i in reversed(range(self.gb_layout.count())): self.gb_layout.itemAt(i).widget().setParent(None) czas = datetime.datetime(2000, 1, 1, 8, 0) dzien = { 1: ('pon_od', 'pon_do'), 2: ('wt_od', 'wt_do'), 3: ('sr_od', 'sr_do'), 4: ('czw_od', 'czw_do'), 5: ('pt_od', 'pt_do'), 6: ('sob_od', 'sob_do'), 7: ('', '') } query = 'SELECT date_format({}, "%H") AS g_start, date_format({}, "%H") AS g_stop FROM godziny WHERE ' \ 'uzytkownik_id = {};'.format(dzien[self.dzien_tyg][0], dzien[self.dzien_tyg][1], self.id_pracownik) wynik = query_to_db(query) if wynik: godzina_stop = (int(wynik[1]) - int(wynik[0])) * 2 godzina = int(wynik[0]) for btn in self.btn_godz: btn.setEnabled(True) else: godzina_stop = 0 godzina = 1 for btn in self.btn_godz: btn.setDisabled(True) minuta = 0 czas = datetime.time(godzina, minuta) for i in range(godzina_stop): self.btn_godz[i].setText(czas.strftime("%H:%M")) self.czas.append(czas) self.btn_godz[i].setObjectName(str(i)) self.gb_layout.addWidget(self.btn_godz[i]) if i % 2 != 0: godzina += 1 minuta = 0 else: minuta = 30 czas = datetime.time(godzina, minuta) QMetaObject.connectSlotsByName(self) # Czyszczenie, odświeżanie self.refresh() query = QSqlQuery( 'SELECT uslugi.uslugi_id, uslugi.nazwa, uslugi.cena, date_format(uslugi.czas, "%H:%i") AS czas FROM uslugi NATURAL JOIN uzytkownik_usluga WHERE uzytkownik_usluga.uzytkownik_id = ' + str(self.id_pracownik) + ';') self.model_u.setQuery(query) self.lbl_klient_.setText('') self.lbl_usluga_.setText('') if self.id_klient > 0 and self.id_pracownik > 0 and self.id_usluga > 0: self.btn_dodaj.setEnabled(True) def if_checked(self, txt, q, val=None): """ Sprawdza poprawność wprowadzonych damych. :param val: wartości do zapytania :param q: zapytanie query MySql :param txt: komunikat """ if self.id_klient < 0 and self.id_pracownik < 0 and self.id_usluga < 0 and self.data is None: msg = QMessageBox(self) msg.setIcon(QMessageBox.Warning) msg.setText(txt) msg.setWindowTitle("Popraw dane") msg.exec_() return False else: print('Trwa zmiana w bazie danych') if val: print('Połączenie') query_to_db(q, val) else: print('Transakcja') return transaction_to_db(q) return True def refresh(self): """ Odświeża widok tabeli rezerwacji """ # Odświeżanie widoku tabeli query = QSqlQuery( 'SELECT wizyty.wizyty_id, CONCAT(klienci.imie, " ", klienci.nazwisko) AS klient, uslugi.nazwa, ' 'wizyty.rezerwacja_od, wizyty.rezerwacja_do, wizyty.status FROM wizyty,klienci,uslugi WHERE wizyty.klienci_id= klienci.klienci_id AND wizyty.uslugi_id = uslugi.uslugi_id AND wizyty.rezerwacja_od > CURRENT_TIMESTAMP AND wizyty.uzytkownik_id = ' + str(self.id_pracownik) + ';') self.model.setQuery(query) self.view.reset() def add(self): """ Dodaje rezerwację do bazy danych i odświeża widok. """ tekst = 'Nie wprowadzono wszystkich danych' self.data = self.lbl_termin_.dateTime().toString(Qt.ISODate) self.data_do = datetime.datetime.fromisoformat( self.data) + datetime.timedelta( hours=datetime.time.fromisoformat(self.data_do).hour, minutes=datetime.time.fromisoformat(self.data_do).minute) # Dodanie nowego użytkownika query = 'INSERT INTO wizyty (klienci_id, uslugi_id, uzytkownik_id, rezerwacja_od, rezerwacja_do, ' \ 'status) VALUES (%s, %s, %s, %s, %s, %s);' val = (self.id_klient, self.id_usluga, self.id_pracownik, self.data, str(self.data_do.isoformat()), 'oczekuje') print(val) if self.if_checked(tekst, query, val): msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Rezerwacja została dodana do bazy danych') msg.setWindowTitle("Dodano nową rezerwację") msg.exec_() self.refresh() def modify(self): """ Zmienia status rezerwacji i odświeża widok. """ tekst = 'Nie wprowadzono wszystkich danych' items = ('Oczekuje', 'Wykonana', 'Rezygnacja') item, ok = QInputDialog.getItem(self, "Wybierz status", "Wybierz nowy status rezerwacji", items, 0, False) if ok and item: # Zmodyfikowanie statusu query = 'UPDATE wizyty SET status = %s WHERE wizyty_id = %s;' val = (item.lower(), self.id_rezerwacje) if self.if_checked(tekst, query, val): msg = QMessageBox(self) msg.setIcon(QMessageBox.Information) msg.setText('Status rezerwacji został zmodyfikowany') msg.setWindowTitle("Zmodyfikowano status") msg.exec_() self.refresh() def remove(self): """ Usuwa rezerwację z bazy danych """ test = 'Błąd! Nie można usunąć danej rezerwacji!' query = 'DELETE FROM wizyty WHERE wizyty_id = %s' val = (self.id_rezerwacje, ) ret = QMessageBox.question( self, 'Usuwanie rezerwacji', "Czy na pewno chcesz usunąć daną rezerwację klienta?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if ret == QMessageBox.Yes: if self.if_checked(test, query, val): msg = QMessageBox() msg.setIcon(QMessageBox.Information) msg.setText('Rezerwacja została usunięta') msg.setWindowTitle("Usunięto") msg.exec_() self.refresh() @pyqtSlot() def on_0_clicked(self): self.lbl_termin_.setTime(self.czas[0]) @pyqtSlot() def on_1_clicked(self): self.lbl_termin_.setTime(self.czas[1]) @pyqtSlot() def on_2_clicked(self): self.lbl_termin_.setTime(self.czas[2]) @pyqtSlot() def on_3_clicked(self): self.lbl_termin_.setTime(self.czas[3]) @pyqtSlot() def on_4_clicked(self): self.lbl_termin_.setTime(self.czas[4]) @pyqtSlot() def on_5_clicked(self): self.lbl_termin_.setTime(self.czas[5]) @pyqtSlot() def on_6_clicked(self): self.lbl_termin_.setTime(self.czas[6]) @pyqtSlot() def on_7_clicked(self): self.lbl_termin_.setTime(self.czas[7]) @pyqtSlot() def on_8_clicked(self): self.lbl_termin_.setTime(self.czas[8]) @pyqtSlot() def on_9_clicked(self): self.lbl_termin_.setTime(self.czas[9]) @pyqtSlot() def on_10_clicked(self): self.lbl_termin_.setTime(self.czas[10]) @pyqtSlot() def on_11_clicked(self): self.lbl_termin_.setTime(self.czas[11]) @pyqtSlot() def on_12_clicked(self): self.lbl_termin_.setTime(self.czas[12]) @pyqtSlot() def on_13_clicked(self): self.lbl_termin_.setTime(self.czas[13]) @pyqtSlot() def on_14_clicked(self): self.lbl_termin_.setTime(self.czas[14]) @pyqtSlot() def on_15_clicked(self): self.lbl_termin_.setTime(self.czas[15]) @pyqtSlot(str) def searching_u(self, text): """ Wyszukuje po wszystkich kolumnach tabeli :param text: """ search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp) self.proxy_u.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy_u.setFilterKeyColumn(-1) @pyqtSlot(str) def searching_k(self, text): """ Wyszukuje po wszystkich kolumnach tabeli :param text: """ search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp) self.proxy_k.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy_k.setFilterKeyColumn(-1) @pyqtSlot(str) def searching_p(self, text): """ Wyszukuje po wszystkich kolumnach tabeli :param text: """ search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp) self.proxy_p.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy_p.setFilterKeyColumn(-1)
class Ui_MainWindow(QMainWindow): def __init__(self): super().__init__() self.select_checkbox_num = 0 self.all_widgets = [] self.game_sub_menus = [] self.face_sub_menus = [] self.setupUi(self) self.updateMenu(self) self.retranslateUi(self) def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(775, 532) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 775, 23)) self.menubar.setObjectName("menubar") self.menu = QtWidgets.QMenu(self.menubar) self.menu.setObjectName("menu") self.menu_team = QtWidgets.QMenu(self.menubar) #参赛队组建菜单 self.menu_team.setObjectName("menu_team") self.menu_face = QtWidgets.QMenu(self.menubar) #对阵组建 self.menu_face.setObjectName("menu_face") MainWindow.setMenuBar(self.menubar) mgr_player = QAction(QIcon(), '运动员管理', self) mgr_player.triggered.connect( functools.partial(self.edit_player, *self.get_player_parmas())) mgr_playground = QAction(QIcon(), '场地管理', self) mgr_playground.triggered.connect( functools.partial(self.edit_player, *self.get_playground_parmas())) mgr_game = QAction(QIcon(), '竞赛项目', self) mgr_game.triggered.connect( functools.partial(self.edit_player, *self.get_game_parmas())) mgr_team = QAction(QIcon(), '参赛团队', self) mgr_team.triggered.connect(self.edit_team) mgr_group = QAction(QIcon(), '分组管理', self) mgr_group.triggered.connect(self.edit_group) mgr_test = QAction(QIcon(), '我的测试', self) mgr_test.triggered.connect(self.test) # mgr_face = QAction(QIcon(),'对阵设定',self) # mgr_face.triggered.connect(self.edit_face) self.toolbar = self.addToolBar('Mytool') self.toolbar.addAction(mgr_player) self.toolbar.addAction(mgr_playground) self.toolbar.addAction(mgr_game) self.toolbar.addAction(mgr_team) self.toolbar.addAction(mgr_group) self.toolbar.addAction(mgr_test) # self.toolbar.addAction(mgr_face) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.action_init = QtWidgets.QAction(MainWindow) self.action_init.setObjectName("action_init") self.action_import_data = QtWidgets.QAction(MainWindow) self.action_import_data.setObjectName("action_import_data") self.action_gamemgr = QtWidgets.QAction(MainWindow) self.action_gamemgr.setObjectName("action_gamemgr") self.menu.addAction(self.action_init) self.menu.addAction(self.action_import_data) self.menu.addSeparator() self.menubar.addAction(self.menu.menuAction()) self.menubar.addAction(self.menu_team.menuAction()) self.menubar.addAction(self.menu_face.menuAction()) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.action_init.triggered.connect(self.clear_data_firm) self.action_import_data.triggered.connect(self.get_data_file) self.add_first_ui() # if has_data(): # self.add_team_ui() # time.sleep(2) # self.centralwidget.hide() # def pr(self): # print('prrrrr') def updateMenu(self, MainWindow): """添加或更新为每个竞赛项目组队的‘参赛队组建’菜单""" self.games = get_games() # 清除‘参赛队组建’原子菜单 for game_sub_menu in self.game_sub_menus: self.menu_team.removeAction(game_sub_menu) for game in self.games: self.game_sub_menus.append(QtWidgets.QAction(MainWindow)) for game_sub_menu, game in zip(self.game_sub_menus, self.games): game_sub_menu.setObjectName(game.name) game_sub_menu.triggered.connect( functools.partial(self.select_player, game.id, game.name, game.team_num, game.sex)) game_sub_menu.setText( QtCore.QCoreApplication.translate("MainWindow", "&{}".format(game.name))) for game_sub_menu in self.game_sub_menus: self.menu_team.addAction(game_sub_menu) """添加或更新为每个竞赛项目组队的‘对阵组建’菜单""" for face_sub_menu in self.face_sub_menus: self.menu_face.removeAction(face_sub_menu) for game in self.games: self.face_sub_menus.append(QtWidgets.QAction(MainWindow)) for game_sub_menu, game in zip(self.face_sub_menus, self.games): game_sub_menu.setObjectName(game.name + '_') game_sub_menu.triggered.connect( functools.partial(self.new_face, game.id)) game_sub_menu.setText( QtCore.QCoreApplication.translate("MainWindow", "&{}".format(game.name))) for game_sub_menu in self.face_sub_menus: self.menu_face.addAction(game_sub_menu) def add_first_ui(self, info="Welcome!"): self.takeCentralWidget() self.main_frame = QScrollArea(self) self.main_frame.setStyleSheet( 'QWidget{background-color:rgb(255,255,255)}') self.wel = QLabel(info) boxlayout = QHBoxLayout() boxlayout.addStretch() boxlayout.addWidget(self.wel) boxlayout.addStretch() self.main_frame.setLayout(boxlayout) self.setCentralWidget(self.main_frame) # def add_team_ui(self): # self.centralwidget = QWidget() # self.form_layout = QHBoxLayout(self.centralwidget) # self.left_layout = MyQVBoxLayout() # self.right_layout = QVBoxLayout() # # qbtn = QPushButton('1') # # qbtn.resize(qbtn.minimumSize()) # self.left_widgts = self.get_left_widgts() # # self.left_layout.addWidget(qbtn) # # self.left_layout.addWidget(QLabel('def')) # for widgt in self.left_widgts: # self.left_layout.addWidget(widgt) # self.left_layout.addStretch() # # self.right_layout.addWidget(QLabel('aaaa'),0,0) # # self.right_layout.addWidget(QLabel('bbbb'),1,0) # self.right_widgts = self.get_right_widgets() # for widgt in self.right_widgts: # self.right_layout.addWidget(widgt) # self.right_layout.addStretch() # self.form_layout.addLayout(self.left_layout) # self.form_layout.addLayout(self.right_layout) # self.setCentralWidget(self.centralwidget) # qbtn.clicked.connect(self.test) # def test(self): # centralwidget = QWidget() # test_layout = QHBoxLayout(centralwidget) # test_layout.addWidget(QLabel('kkkkkkkkkkkkkkkkkkk')) # # self.removeWidget(self.centralwidget) # self.takeCentralWidget() # self.setCentralWidget(centralwidget) # # self.show() # # self.update() # # self.repaint() # def test_tool(self): # print('abccc') # self.wel.setText('akkkkkkkkkkkk!') # self.takeCentralWidget() # self.setCentralWidget(QLabel('kkkdkddaaaaaaaaaaaaaa')) # main_form = QFormLayout() # left_widgt = QWidget(None) # left_widgt_layout = QVBoxLayout() # left_widgt.setLayout(left_widgt_layout) # for i in range(5): # left_widgt_layout.addWidget(QLabel('标签%i' % i)) # for w in self.get_left_widgts(): # left_widgt_layout.addWidget(w) # scroll_area = QScrollArea() # right_widgt = QWidget(None) # self.right_widgt_layout = QVBoxLayout() # right_widgt.setLayout(self.right_widgt_layout) # self.right_widgt_layout.addWidget(QLabel('标签%i' % 5)) # self.right_widgt_layout.addWidget(QLabel('标签%i' % 7)) # scroll_area.setWidget(right_widgt) # main_form.addRow(left_widgt,scroll_area) # main_widgt = QWidget(None) # main_widgt.setLayout(main_form) # self.setCentralWidget(main_widgt) # def get_left_widgts(self): # widgts = [] # self.game_data = get_games() # mylbl = QLabel('运动项目:') # mylbl.setMaximumHeight(20) # widgts.append(mylbl) # self.game_combo = QComboBox(None) # self.game_combo.setMaximumWidth(80) # self.game_combo.setMaximumHeight(20) # for item in self.game_data.keys(): # self.game_combo.addItem(item) # widgts.append(self.game_combo) # self.game_combo.setCurrentIndex(-1) # self.game_combo.activated[str].connect(self.set_cur_game) # return widgts # def set_cur_game(self,game): # self.game = game # print(game,self.game_data[game]) # if self.game_data[game] == 1: # self.show_players(game) # def get_right_widgets(self): # players = get_players() # widgts = [] # for p in players: # data = [p.name,p.idcode,p.sex,p.age,p.work_place,p.tel] # data = ['' if d is None else d for d in data] # info = '{: <8} {: <8} {: <2} {: <2} {: <10} {: <12}'.format(*data) # widgts.append(QLabel(info)) # return widgts # def show_players(self,game): # self.test() # game_sex = get_games_sex() # sex = game_sex[game] # self.players = get_players(sex) # self.p_checkboxes = [QCheckBox(' '.join((p.name,p.idcode))) for p in self.players] # for w in self.right_widgts: # w.hide() # for cb in self.p_checkboxes: # cb.toggle() # print('abc') # self.right_layout.addWidget(cb) # self.right_layout.addStretch() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "易用竞赛管理系统")) self.menu.setTitle(_translate("MainWindow", "&管理数据")) self.action_init.setText(_translate("MainWindow", "&清理数据")) self.action_import_data.setText(_translate("MainWindow", "&导入数据")) self.menu_team.setTitle(_translate("MainWindow", "&参赛队组建")) self.menu_face.setTitle(_translate("MainWindow", "&对阵组建")) def get_data_file(self): fname = QFileDialog.getOpenFileName(self, '打开文件', '.\\') if fname[0]: info = load_data(fname[0]) if info: QMessageBox.information(self, "数据错误,请修改后重新导入!", info) else: QMessageBox.information(self, "提示:", '数据导入成功!') self.add_first_ui('数据已导入!') # self.add_team_ui() self.updateMenu(self) def clear_data_firm(self): reply = QMessageBox.question(self, '确认', '确定删除数据?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) self.takeCentralWidget() if reply == QMessageBox.Yes: clear_data() self.add_first_ui('数据已全部清空!') def get_player_parmas(self): head_lst = ['索引号', '姓名', '身份证号', '性别', '年龄', '工作单位', '电话'] keys = ['id', 'name', 'idcode', 'sex', 'age', 'work_place', 'tel'] return get_players, keys, head_lst, Player def get_playground_parmas(self): head_lst = ['索引号', '场地名', '使用状态', '备注'] keys = ['id', 'name', 'using', 'memo'] return get_playgrounds, keys, head_lst, PlayGround def get_game_parmas(self): head_lst = ['索引号', '竞赛项目', '队员人数', '队员性别', '备注'] keys = ['id', 'name', 'team_num', 'sex', 'memo'] return get_games, keys, head_lst, Games def edit_player(self, getfunc, keys, head_lst, obj): model_objs = getfunc() datas = [] for model_obj in model_objs: # data = [p.id,p.name,p.idcode,p.sex,p.age,p.work_place,p.tel] data = [getattr(model_obj, key) for key in keys] data = ['' if d is None else d for d in data] datas.append(data) # head_lst = ['索引号','姓名','身份证号','性别','年龄','工作单位','电话'] if datas: self.takeCentralWidget() main_frame = QScrollArea(self) main_frame.setStyleSheet( 'QWidget{background-color:rgb(255,255,255)}') self.player_tabview = QTableView() r, c = len(datas), len(datas[0]) self.player_model = QStandardItemModel(r, c) self.player_model.setHorizontalHeaderLabels(head_lst) for r, rdata in enumerate(datas): for c, cell in enumerate(rdata): it = QStandardItem(str(cell)) if c == 0: it.setEditable(False) self.player_model.setItem(r, c, it) # keys = ['id','name','idcode','sex','age','work_place','tel'] edit_cell = functools.partial(self.edit_cell, obj, keys) self.player_model.itemChanged.connect(edit_cell) self.player_tabview.setModel(self.player_model) boxlayout = QVBoxLayout() # boxlayout.addStretch(1) boxlayout.addWidget(self.player_tabview, 18) # boxlayout.addStretch(1) del_btn = QPushButton('删除') del_btn.clicked.connect(functools.partial(self.del_row, obj)) boxlayout.addWidget(del_btn) main_frame.setLayout(boxlayout) self.setCentralWidget(main_frame) def edit_cell(self, obj, keys): r = self.player_tabview.currentIndex().row() c = self.player_tabview.currentIndex().column() curr_data = self.player_tabview.currentIndex().data() item = self.player_model.index(r, 0) param = dict() param[keys[c]] = curr_data save_cell(obj, int(item.data()), param) if obj == Games and 'name' in param: self.updateMenu(self) def del_row(self, obj): reply = QMessageBox.question(self, '确认', '确定删除数据?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: r = self.player_tabview.currentIndex().row() item = self.player_model.index(r, 0) # print(int(item.data())) del_rowdb(obj, int(item.data())) self.player_model.removeRow(r) if obj == Games: self.updateMenu(self) def edit_team(self): datas = get_team_datas() head_lst = ['索引号', '队名', '项目', '分组'] if datas: self.takeCentralWidget() main_frame = QScrollArea(self) main_frame.setStyleSheet( 'QWidget{background-color:rgb(255,255,255)}') self.player_tabview = QTableView() r, c = len(datas), len(datas[0]) self.player_model = QStandardItemModel(r, c) self.player_model.setHorizontalHeaderLabels(head_lst) for r, rdata in enumerate(datas): for c, cell in enumerate(rdata): it = QStandardItem(str(cell)) if c == 0: it.setEditable(False) self.player_model.setItem(r, c, it) # keys = ['id','name','idcode','sex','age','work_place','tel'] # edit_cell = functools.partial(self.edit_cell,obj,keys) # self.player_model.itemChanged.connect(edit_cell) self.player_tabview.setModel(self.player_model) boxlayout = QVBoxLayout() # boxlayout.addStretch(1) boxlayout.addWidget(self.player_tabview, 18) # boxlayout.addStretch(1) del_btn = QPushButton('删除') del_btn.clicked.connect(self.del_team) boxlayout.addWidget(del_btn) main_frame.setLayout(boxlayout) self.setCentralWidget(main_frame) def del_team(self): # v = MyDialog() # if v.exec_(): # name,game = v.get_data() # print(name,game) reply = QMessageBox.question(self, '确认', '确定删除数据?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: r = self.player_tabview.currentIndex().row() item = self.player_model.index(r, 0) # print(int(item.data())) del_rowdb(Team, int(item.data())) self.player_model.removeRow(r) def select_player(self, gid, gname, gteam_num, gsex): # 新建团队UI players = get_players(gsex) head_lst = ['索引号', '姓名', '身份证号', '性别', '年龄', '工作单位', '电话'] keys = ['id', 'name', 'idcode', 'sex', 'age', 'work_place', 'tel'] datas = [] for player in players: data = [getattr(player, key) for key in keys] data = ['' if d is None else d for d in data] datas.append(data) if datas: self.takeCentralWidget() main_frame = QScrollArea(self) main_frame.setStyleSheet( 'QWidget{background-color:rgb(255,255,255)}') self.player_tabview = QTableView() r, c = len(datas), len(datas[0]) self.player_model = QStandardItemModel(r, c) print(self.player_tabview.itemDelegate()) self.player_model.setHorizontalHeaderLabels(head_lst) for r, rdata in enumerate(datas): for c, cell in enumerate(rdata): it = QStandardItem(str(cell)) if c == 0: it.setEditable(False) self.player_model.setItem(r, c, it) self.player_tabview.setModel(self.player_model) boxlayout = QVBoxLayout() # boxlayout.addStretch(1) boxlayout.addWidget(self.player_tabview, 18) # boxlayout.addStretch(1) new_btn = QPushButton('新建团队({})'.format(gname)) new_btn.clicked.connect( functools.partial(self.add_team, gid, gteam_num, gsex)) boxlayout.addWidget(new_btn) main_frame.setLayout(boxlayout) self.setCentralWidget(main_frame) def add_team(self, gid, gteam_num, gsex): # 新建团队方法 rows = set() pids = [] for selected_model_index in self.player_tabview.selectedIndexes(): rows.add(selected_model_index.row()) for r in rows: item = self.player_model.index(r, 0) pids.append(item.data()) if gteam_num == 1: info = new_team(gid, pids, flag=1) if info: QMessageBox.warning(self, '完成', info, QMessageBox.Ok) else: QMessageBox.information(self, '完成', '成功建立!', QMessageBox.Ok) if gteam_num > 1: if len(rows) == gteam_num: info = new_team(gid, pids) if info: QMessageBox.warning(self, '完成', info, QMessageBox.Ok) else: QMessageBox.information(self, '完成', '成功建立!', QMessageBox.Ok) else: QMessageBox.warning(self, '错误', '请选中指定的运动员数:{}'.format(gteam_num), QMessageBox.Ok) self.player_tabview.clearSelection() def test(self): from .modeltt import TObjModel, MyDelegate md = MyDelegate() self.takeCentralWidget() main_frame = QScrollArea(self) main_frame.setStyleSheet('QWidget{background-color:rgb(255,255,255)}') self.player_tabview = QTableView() self.player_model = TObjModel() self.player_tabview.setModel(self.player_model) boxlayout = QVBoxLayout() # boxlayout.addStretch(1) boxlayout.addWidget(self.player_tabview, 18) self.player_tabview.setItemDelegateForColumn(2, md) self.player_tabview.hideColumn(0) main_frame.setLayout(boxlayout) self.setCentralWidget(main_frame) def edit_group(self): datas = get_group_datas() head_lst = ['索引号', '组名', '项目', '所含队名', 'gameid'] self.takeCentralWidget() main_frame = QScrollArea(self) main_frame.setStyleSheet('QWidget{background-color:rgb(255,255,255)}') self.player_tabview = QTableView() self.player_model = QStandardItemModel() self.player_model.setHorizontalHeaderLabels(head_lst) if datas: r, c = len(datas), len(datas[0]) # self.player_model = QStandardItemModel(r,c) self.player_model.setHorizontalHeaderLabels(head_lst) for r, rdata in enumerate(datas): for c, cell in enumerate(rdata): it = QStandardItem(str(cell)) # if c == 0: it.setEditable(False) self.player_model.setItem(r, c, it) # keys = ['id','name','idcode','sex','age','work_place','tel'] # edit_cell = functools.partial(self.edit_cell,obj,keys) # self.player_model.itemChanged.connect(edit_cell) self.player_tabview.setModel(self.player_model) boxlayout = QVBoxLayout() # boxlayout.addStretch(1) boxlayout.addWidget(self.player_tabview, 18) # boxlayout.addStretch(1) self.player_tabview.hideColumn(4) add_btn = QPushButton('添加分组') add_btn.clicked.connect(self.add_group) boxlayout.addWidget(add_btn) del_btn = QPushButton('删除分组') del_btn.clicked.connect(functools.partial(self.del_row, Group)) boxlayout.addWidget(del_btn) add_team_btn = QPushButton('分配参赛团队') add_team_btn.clicked.connect(self.add_team2group) boxlayout.addWidget(add_team_btn) main_frame.setLayout(boxlayout) self.setCentralWidget(main_frame) def add_group(self): v = MyDialog() if v.exec_(): name, game = v.get_data() if name and game: info = add_groupdb(name, int(game)) if info: QMessageBox.warning(self, '错误', info, QMessageBox.Ok) else: QMessageBox.information(self, '完成', '成功建立!', QMessageBox.Ok) self.edit_group() def add_team2group(self): rows = set() for selected_model_index in self.player_tabview.selectedIndexes(): rows.add(selected_model_index.row()) if len(rows) != 1: QMessageBox.warning(self, '错误', '请仅选择其中一个小组', QMessageBox.Ok) return row = rows.pop() groupid = self.player_model.index(row, 0).data() gameid = self.player_model.index(row, 4).data() print(groupid, gameid) if get_team_datas(gameid): v = GroupDialog(gameid, "添加团队到小组", get_team_datas) if v.exec_(): tids = v.get_data() print(tids) if tids: add_team2group_db(groupid, tids) QMessageBox.information(self, '提示', '操作完成!', QMessageBox.Ok) else: QMessageBox.information(self, '提示', '无参赛团队可以分组!', QMessageBox.Ok) def get_grp_combo(self, gid): groups = get_group_for_game(gid) cur_index = -1 grp_combo = QComboBox() for index, (ggid, gname, ggname) in enumerate(groups): grp_combo.addItem('-'.join((ggname, gname)), ggid) grp_combo.setCurrentIndex(cur_index) grp_combo.currentIndexChanged.connect( functools.partial(self.disp_face, gid)) grp_combo.setToolTip('请选择一个分组,并为其建立对阵。') return grp_combo def new_face(self, gid): # print(gid) self.takeCentralWidget() main_frame = QScrollArea(self) main_frame.setStyleSheet('QWidget{background-color:rgb(255,255,255)}') boxlayout = QVBoxLayout() self.grp_combo = self.get_grp_combo(gid) boxlayout.addWidget(self.grp_combo) # boxlayout.addStretch(1) self.face_view = QTableView() self.face_model = QStandardItemModel() self.face_model.setHorizontalHeaderLabels(['id', '队A', '队B']) self.face_view.setModel(self.face_model) boxlayout.addWidget(self.face_view) add_btn = QPushButton('添加对阵') add_btn.clicked.connect(functools.partial(self.add_face, gid)) boxlayout.addWidget(add_btn) main_frame.setLayout(boxlayout) self.setCentralWidget(main_frame) def disp_face(self, gid): # print(self.grp_combo.currentIndex(),self.grp_combo.currentText()) self.ggid = int(self.grp_combo.itemData(self.grp_combo.currentIndex())) if self.ggid >= 1: self.face_model.beginResetModel() self.face_model.clear() self.face_model.setHorizontalHeaderLabels(['id', '队A', '队B']) faces = get_faces(gid, self.ggid) for r, rd in enumerate(faces): for c, cd in enumerate(rd): item = QStandardItem(str(cd)) item.setEditable(False) self.face_model.setItem(r, c, item) self.face_model.endResetModel() def add_face(self, gid): v = GroupDialog(self.ggid, "添加对阵团队", get_teams_for_group) if v.exec_(): tids = v.get_data() print(tids) tids = [int(tid) for tid in tids] if len(tids) != 2: QMessageBox.warning(self, '错误', '请仅选择对阵的双方小组', QMessageBox.Ok) else: tids.sort() if add_face2db(*tids): self.disp_face(gid) QMessageBox.information(self, '提示', '操作完成!', QMessageBox.Ok) else: QMessageBox.warning(self, '错误', '对阵不能重复!', QMessageBox.Ok)