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 NarzPoz(QWidget): def __init__(self, parent): super(QWidget, self).__init__(parent) self.pozycja = 'Brak' self.proxy = QSortFilterProxyModel(self) self.proxy_poz = QSortFilterProxyModel(self) self.edit_wysz = QLineEdit(self) self.combo_typ = QComboBox(self) self.lbl_wysz = QLabel("Wyszukaj") self.lbl_typ = QLabel("Wybierz typ narzędzia:") self.combo_poz = QComboBox(self) self.lbl_poz = QLabel("Wybierz pozycję:") self.listaPozycji = [] self.table = QTableView(self) self.table_narz = QTableView(self) sciezka = czy_istnieje() db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName(sciezka) if db.open(): print('Otworzono bazę danych') self.model = QSqlTableModel(self, db) self.model_poz = QSqlTableModel(self, db) self.parent = parent self.formularz = QGroupBox("Przypisz narzędzia") self.initUI() def initUI(self): self.naglowki_kolumn() # todo dodać okno z wyborem oprawki po wyborze narzędzia typy_narzedzi = [ 'Brak', 'Frez palcowy', 'Frez płytkowy (głowica)', 'Gwintownik', 'Nóż tokarski', # 'Oprawka', 'Piła', 'Pozostałe', 'Rozwiertak', 'Wiertło', 'Wiertło składane', 'Wygniatak' ] self.widok() # Zatwierdzenie ok_button = QPushButton("Dodaj do pozycji") cancel_button = QPushButton("Cofnij") wydrukuj_btn = QPushButton("Wyeksportuj") usun_btn = QPushButton("Usuń pozycję") dodaj_btn = QPushButton("Dodaj pozycję") hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(ok_button) hbox.addWidget(cancel_button) # Layouty layout_v = QVBoxLayout() l_1 = QHBoxLayout() l_2 = QHBoxLayout() l_3 = QHBoxLayout() layout_h = QHBoxLayout() # Funkcje self.combo_typ.addItems(typy_narzedzi) self.combo_poz.addItems(self.listaPozycji) self.proxy_poz.setSourceModel(self.model_poz) self.table.setModel(self.proxy_poz) self.proxy.setSourceModel(self.model) self.table_narz.setModel(self.proxy) # Przyporzadkowanie l_1.addWidget(self.lbl_typ) l_1.addWidget(self.combo_typ) l_2.addWidget(self.lbl_wysz) l_2.addWidget(self.edit_wysz) l_3.addWidget(wydrukuj_btn) l_3.addWidget(usun_btn) l_3.addWidget(dodaj_btn) layout_h.addWidget(self.lbl_poz) layout_h.addWidget(self.combo_poz) layout_v.addLayout(layout_h, 1) layout_v.addLayout(l_1) layout_v.addLayout(l_2) layout_v.addLayout(l_3) layout_v.addWidget(self.table) layout_v.addWidget(self.table_narz) self.formularz.setLayout(layout_v) main_layout = QVBoxLayout() main_layout.addWidget(self.formularz) main_layout.addLayout(hbox) self.setLayout(main_layout) # connecty # ok_button.clicked.connect(self.dodaj) cancel_button.clicked.connect(self.anulowanie) dodaj_btn.clicked.connect(self.dodaj_poz) ok_button.clicked.connect(self.klikniecie) usun_btn.clicked.connect(self.usun_pozycje) wydrukuj_btn.clicked.connect(self.wydrukuj) self.edit_wysz.textChanged.connect(self.wyszukiwanie) self.combo_typ.activated[str].connect(self.onActiveNarz) self.combo_poz.activated[str].connect(self.onActivePoz) # Menu kontekstowe własne self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.prawoklik) def wydrukuj(self): poz_lista = [ 'Wykaz narzędzi ' + self.pozycja, "SELECT * FROM '" + self.pozycja + "'", 'Baza nie zawiera żadnych pozycji. Plik nie zostanie zapisany.', ] from gui import Window if self.pozycja != 'Brak': Window.export(self, poz_lista) self.parent.statusBar().showMessage("Wyeksportowano do pliku", 10000) else: QMessageBox.critical(self, 'Wybierz pozycję', 'Nie wybrano żadnej pozycji!', QMessageBox.Ok, QMessageBox.Ok) def naglowki_kolumn(self): # Nagłówki kolumn self.listaPozycji.append('Brak') for i in naglowki(): if "/" in i[0]: self.listaPozycji.append(i[0]) def usun_pozycje(self): text, ok = QInputDialog.getItem(self, 'Usuń pozycje', 'Wybierz pozycję do usunięcia', self.listaPozycji[1:], editable=False) if ok: if text != 'Brak': print(text) query = 'DROP TABLE "main"."' + text + '";' polaczenie(query) self.listaPozycji.clear() self.naglowki_kolumn() indeks = self.combo_poz.findText(text) self.combo_poz.removeItem(indeks) self.parent.statusBar().showMessage("Usunięto pozycję", 10000) else: msg = QMessageBox() msg.setIcon(QMessageBox.Warning) msg.setWindowIcon(QIcon('icons/cow.png')) msg.setText("Wybierz poprawną pozycję") msg.setWindowTitle("Niewłaściwa pozycja") msg.exec_() self.usun_pozycje() def prawoklik(self): menu = QMenu(self) akcja = QAction('Usuń narzędzie', self) akcja.triggered.connect(self.usun_wiersz) menu.addAction(akcja) menu.exec_(QCursor.pos()) def usun_wiersz(self): selected = self.table.currentIndex() self.model_poz.removeRow(selected.row()) self.model_poz.submitAll() self.model_poz.select() self.parent.statusBar().showMessage("Usunięto narzędzie", 10000) def dodaj_poz(self): text, ok = QInputDialog.getText(self, 'Wprowadź pozycje', 'Pozycja:') if ok and text: query = 'CREATE TABLE IF NOT EXISTS "' + text + '" ("id_poz" INTEGER PRIMARY ' \ 'KEY AUTOINCREMENT, ' \ '"symbol_narz" TEXT, ' \ '"vc" INTEGER, "obroty" ' \ 'INTEGER, "fz" REAL, "posuw" ' \ 'INTEGER); ' print(query) polaczenie(query) self.listaPozycji.clear() self.combo_poz.addItem(text) self.naglowki_kolumn() self.parent.statusBar().showMessage("Dodano pozycję " + text, 10000) else: print("Nie wpisano pozycji") def onActivePoz(self, tekst): self.pozycja = tekst naglowki = { 'id_poz': 'ID', 'symbol_narz': 'Symbol narzędzia', 'vc': 'Prędkość skrawania Vc [m/min]', 'obroty': 'Obroty n [obr/min]', 'fz': 'Posuw na ząb fz [mm/ostrze]', 'posuw': 'Posuw liniowy f [mm/min]' } self.model_poz.setTable(tekst) self.model_poz.setEditStrategy(QSqlTableModel.OnFieldChange) self.model_poz.select() # Ustawianie nagłówków ilosc_kolumn = self.model_poz.columnCount() for i in range(ilosc_kolumn): nazwa_kolumn = self.model_poz.headerData(i, Qt.Horizontal) self.model_poz.setHeaderData(i, Qt.Horizontal, naglowki[nazwa_kolumn]) def onActiveNarz(self, tekst): slownik = { 'Frez palcowy': 'frezy_palcowe', 'Frez płytkowy (głowica)': 'frezy_plytkowe', 'Gwintownik': 'gwintowniki', 'Nóż tokarski': 'noze_tokarskie', 'Oprawka': 'oprawki', 'Piła': 'pily', 'Pozostałe': 'pozostale', 'Rozwiertak': 'rozwiertaki', 'Wiertło': 'wiertla', 'Wiertło składane': 'wiertla_skladane', 'Wygniatak': 'wygniataki', 'Brak': '' } naglowki = { 'idfrezy_palcowe': 'ID', 'symbol_freza': 'Symbol', 'producent_fr': 'Producent', 'srednica_fr': 'Średnica', 'dl_fr': 'Długość całkowita', 'dl_rob_fr': 'Długość robocza', 'idfrezy_plytkowe': 'ID', 'symbol_frez_pl': 'Symbol', 'producent_fp': 'Producent', 'srednica_fr_pl': 'Średnica', 'ilosc_plytek': 'Ilość płytek', 'symbol_pl': 'Symbol płytek', 'ilosc_krawedzi_pl': 'Ilość krawędzi płytki', 'idgwintowniki': 'ID', 'symbol_g': 'Symbol', 'producent_gw': 'Producent', 'rozmiar_gwintu': 'Rozmiar gwintu i skok', 'typ_gwintownika': 'Typ gwintownika', 'idnoze_tokarskie': 'ID', 'symbol_n': 'Symbol', 'producent_n': 'Producent', 'plytki_n': 'Symbol płytek', 'ilosc_krawedzi_pl_n': 'Ilość krawędzi', 'idpily': 'ID', 'symbol_p': 'Symbol', 'producent_pil': 'Producent', 'srednica_p': 'Średnica', 'grubosc_p': 'Grubość', 'rodzaj_pl_p': 'Symbol płytek', 'ilosc_pl_p': 'Ilość płytek', 'ilosc_kraw_p': 'Ilość krawędzi płytki', 'idpozostale': 'ID', 'symbol_poz': 'Symbol', 'producent_poz': 'Producent', 'srednica_poz': 'Średnica', 'ilosc_pl_poz': 'Ilość płytek', 'plytki_poz': 'Symbol płytek', 'idrozwiertaki': 'ID', 'symbol_r': 'Symbol', 'producent_roz': 'Producent', 'rozmiar_r': 'Rozmiar', 'idwiertla': 'ID', 'symbol_w': 'Symbol', 'producent_w': 'Producent', 'srednica_w': 'Średnica', 'dlugosc_w': 'Długość [mm]', 'idwiertla_skladane': 'ID', 'symbol_w_skl': 'Symbol', 'producent_ws': 'Producent', 'srednica_w_skl': 'Średnica', 'plytki_w_skl': 'Symbol płytek', 'idwygniataki': 'ID', 'symbol_wyg': 'Symbol', 'producent_wyg': 'Producent', 'rozmiar_gw': 'Rozmiar gwintu' } self.model.setTable(slownik[tekst]) self.model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.model.select() # 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]) @pyqtSlot(str) def wyszukiwanie(self, text): search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp) self.proxy.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy.setFilterKeyColumn(-1) # opcja z wyszukiwaniem def widok(self): # Ustawianie własciwości widoku self.table_narz.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table_narz.setSelectionMode(QAbstractItemView.SingleSelection) self.table_narz.setSelectionBehavior(QAbstractItemView.SelectRows) self.table_narz.verticalHeader().setVisible(False) self.table_narz.setSortingEnabled(True) self.table_narz.setModel(self.model) self.table.verticalHeader().setVisible(False) self.table.setSortingEnabled(True) self.table.setAlternatingRowColors(True) self.table.setModel(self.model_poz) # self.table.hideColumn(0) self.table_narz.doubleClicked.connect(self.klikniecie) @pyqtSlot() def klikniecie(self): x = self.table_narz.currentIndex().row() y = self.table_narz.currentIndex().column() nazwa = self.table_narz.currentIndex().sibling(x, 1).data() print(nazwa) # Dodanie narzędzia do pozycji if nazwa: print(nazwa) query = "INSERT INTO '" + self.model_poz.tableName( ) + "'(symbol_narz) VALUES ('" + nazwa + "') " polaczenie(query) # Odświeża tabelę self.model_poz.select() self.parent.statusBar().showMessage( "Dodano narzędzie " + nazwa + " do pozycji " + self.model_poz.tableName(), 10000) else: print(self.model_poz.tableName()) print("Brak wybranego narzędzia") def anulowanie(self): self.parent.statusBar().clearMessage() from opcje_qt import Wewnatrz menu_gl = Wewnatrz(self.parent) self.parent.setCentralWidget(menu_gl)
class Wyswietl(QWidget): def __init__(self, parent): super(QWidget, self).__init__(parent) self.parent = parent self.proxy = QSortFilterProxyModel(self) self.edit_wysz = QLineEdit(self) self.combo_typ = QComboBox(self) self.lbl_wysz = QLabel("Wyszukaj") self.lbl_typ = QLabel("Wybierz typ narzędzia:") self.table = QTableView(self) sciezka = czy_istnieje() db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName(sciezka) if db.open(): print('Otworzono bazę danych') self.model = QSqlTableModel(self, db) self.formularz = QGroupBox("Wyświetl narzędzia") self.initUI() def initUI(self): typy_narzedzi = [ 'Brak', 'Frez palcowy', 'Frez płytkowy (głowica)', 'Gwintownik', 'Nóż tokarski', # 'Oprawka', 'Piła', 'Pozostałe', 'Rozwiertak', 'Wiertło', 'Wiertło składane', 'Wygniatak' ] self.widok() self.combo_typ.addItems(typy_narzedzi) cancel_button = QPushButton("Cofnij") hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(cancel_button) l_h = QHBoxLayout() l_h.addWidget(self.lbl_typ) l_h.addWidget(self.combo_typ) l_h2 = QHBoxLayout() l_h2.addWidget(self.lbl_wysz) l_h2.addWidget(self.edit_wysz) layout_v = QVBoxLayout() layout_v.addLayout(l_h) layout_v.addLayout(l_h2) layout_v.addWidget(self.table) self.proxy.setSourceModel(self.model) self.table.setModel(self.proxy) main_layout = QVBoxLayout() self.formularz.setLayout(layout_v) main_layout.addWidget(self.formularz) main_layout.addLayout(hbox) self.setLayout(main_layout) cancel_button.clicked.connect(self.anulowanie) self.edit_wysz.textChanged.connect(self.wyszukiwanie) self.combo_typ.activated[str].connect(self.onActiveNarz) # Menu kontekstowe własne self.table.setContextMenuPolicy(Qt.CustomContextMenu) self.table.customContextMenuRequested.connect(self.prawoklik) def prawoklik(self): menu = QMenu(self) if self.model.rowCount(): akcja = QAction('Usuń narzędzie', self) akcja.triggered.connect(self.usun_wiersz) menu.addAction(akcja) menu.exec_(QCursor.pos()) def usun_wiersz(self): ok = QMessageBox.question(self, 'Potwierdzenie', 'Czy na pewno chcesz usunąć narzędzie?', QMessageBox.Ok, QMessageBox.Cancel) if ok == QMessageBox.Ok: selected = self.table.currentIndex() self.model.removeRow(selected.row()) self.model.submitAll() self.model.select() self.parent.statusBar().showMessage("Usunięto narzędzie", 10000) def onActiveNarz(self, tekst): slownik = { 'Frez palcowy': 'frezy_palcowe', 'Frez płytkowy (głowica)': 'frezy_plytkowe', 'Gwintownik': 'gwintowniki', 'Nóż tokarski': 'noze_tokarskie', 'Oprawka': 'oprawki', 'Piła': 'pily', 'Pozostałe': 'pozostale', 'Rozwiertak': 'rozwiertaki', 'Wiertło': 'wiertla', 'Wiertło składane': 'wiertla_skladane', 'Wygniatak': 'wygniataki', 'Brak': '' } naglowki = { 'idfrezy_palcowe': 'ID', 'symbol_freza': 'Symbol', 'producent_fr': 'Producent', 'srednica_fr': 'Średnica', 'dl_fr': 'Długość całkowita', 'dl_rob_fr': 'Długość robocza', 'idfrezy_plytkowe': 'ID', 'symbol_frez_pl': 'Symbol', 'producent_fp': 'Producent', 'srednica_fr_pl': 'Średnica', 'ilosc_plytek': 'Ilość płytek', 'symbol_pl': 'Symbol płytek', 'ilosc_krawedzi_pl': 'Ilość krawędzi płytki', 'idgwintowniki': 'ID', 'symbol_g': 'Symbol', 'producent_gw': 'Producent', 'rozmiar_gwintu': 'Rozmiar gwintu i skok', 'typ_gwintownika': 'Typ gwintownika', 'idnoze_tokarskie': 'ID', 'symbol_n': 'Symbol', 'producent_n': 'Producent', 'plytki_n': 'Symbol płytek', 'ilosc_krawedzi_pl_n': 'Ilość krawędzi', 'idpily': 'ID', 'symbol_p': 'Symbol', 'producent_pil': 'Producent', 'srednica_p': 'Średnica', 'grubosc_p': 'Grubość', 'rodzaj_pl_p': 'Symbol płytek', 'ilosc_pl_p': 'Ilość płytek', 'ilosc_kraw_p': 'Ilość krawędzi płytki', 'idpozostale': 'ID', 'symbol_poz': 'Symbol', 'producent_poz': 'Producent', 'srednica_poz': 'Średnica', 'ilosc_pl_poz': 'Ilość płytek', 'plytki_poz': 'Symbol płytek', 'idrozwiertaki': 'ID', 'symbol_r': 'Symbol', 'producent_roz': 'Producent', 'rozmiar_r': 'Rozmiar', 'idwiertla': 'ID', 'symbol_w': 'Symbol', 'producent_w': 'Producent', 'srednica_w': 'Średnica', 'dlugosc_w': 'Długość [mm]', 'idwiertla_skladane': 'ID', 'symbol_w_skl': 'Symbol', 'producent_ws': 'Producent', 'srednica_w_skl': 'Średnica', 'plytki_w_skl': 'Symbol płytek', 'idwygniataki': 'ID', 'symbol_wyg': 'Symbol', 'producent_wyg': 'Producent', 'rozmiar_gw': 'Rozmiar gwintu' } self.model.setTable(slownik[tekst]) self.model.setEditStrategy(QSqlTableModel.OnManualSubmit) self.model.select() # 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]) @pyqtSlot(str) def wyszukiwanie(self, text): search = QRegExp(text, Qt.CaseInsensitive, QRegExp.RegExp ) self.proxy.setFilterRegExp(search) # Odpowiedzialne za kolumnę, po której filtruje self.proxy.setFilterKeyColumn(-1) def widok(self): # Ustawianie własciwości widoku self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.table.setSelectionBehavior(QAbstractItemView.SelectRows) self.table.verticalHeader().setVisible(False) self.table.setSortingEnabled(True) self.table.setModel(self.model) def anulowanie(self): self.parent.statusBar().clearMessage() from opcje_qt import Wewnatrz menu_gl = Wewnatrz(self.parent) self.parent.setCentralWidget(menu_gl)
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 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 ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow): def __init__(self): # Это здесь нужно для доступа к переменным, методам # и т.д. в файле design.py super().__init__() self.setupUi(self) # Это нужно для инициализации нашего дизайна db = QSqlDatabase.addDatabase('QSQLITE') db.setDatabaseName('data.db') db.open() self.model = QSqlTableModel(self) self.model.setTable(db.tables()[0]) self.model.setEditStrategy(QSqlTableModel.OnFieldChange) self.tableView.setModel(self.model) self.model.select() self.tableView.setSortingEnabled(True) self.add_row.clicked.connect(self.addRow) self.del_row.clicked.connect(self.delRow) # Выбор таблицы для вывода: self.select_table.addItems(db.tables()) self.select_table.currentTextChanged.connect(self.update_current_table) # Выбор таблицы для фильтра: columns = [] for i in range(self.model.record().count()): columns.append(self.model.headerData(i, QtCore.Qt.Horizontal)) self.filter_col.addItems(columns) # Обработка фильтров: self.button_apply_filter.clicked.connect(self.apply_filter) self.button_cancel_filter.clicked.connect(self.cancel_filter) def get_name_columns(self): columns = [] for i in range(self.model.record().count()): columns.append(self.model.headerData(i, QtCore.Qt.Horizontal)) return columns def apply_filter(self): select_filter = self.filter_arg.displayText() try: select_filter = int(self.filter_arg.displayText()) self.model.setFilter( f"{self.filter_col.currentText()}={select_filter}") except ValueError: try: symbol = select_filter[0] select_filter = int(select_filter[1:]) if symbol == '=' or symbol == '<' or symbol == '>': self.model.setFilter( f"{self.filter_col.currentText()} {symbol} {select_filter}" ) else: print('Возникла ошибка') except ValueError: self.model.setFilter( f"{self.filter_col.currentText()} LIKE '{self.filter_arg.displayText()}'" ) def cancel_filter(self): self.model.setFilter("") def update_current_table(self): self.model.setTable(self.select_table.currentText()) self.filter_col.clear() columns = [] for i in range(self.model.record().count()): columns.append(self.model.headerData(i, QtCore.Qt.Horizontal)) self.filter_col.addItems(columns) self.model.select() def addRow(self): self.model.insertRow(self.model.rowCount()) def delRow(self): self.model.removeRow(self.tableView.currentIndex().row()) self.model.select()
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): def __init__(self): super().__init__() self.UI = Ui_MainWindow() self.UI.setupUi(self) self.UI.action_mn1_1.triggered.connect(self.action_mn1_1_triggered) self.UI.action_mn1_2.triggered.connect(self.close) self.UI.action_mn2_1.triggered.connect(self.action_mn2_1_triggered) self.UI.action_mn2_2.triggered.connect(self.action_mn2_2_triggered) self.UI.listView_pg1_gp1_1.clicked.connect( self.listView_pg1_gp1_1_clicked) self.UI.listView_pg1_gp1_1.setEditTriggers( QAbstractItemView.NoEditTriggers) self.UI.pushButton_pg1_gp1_1.clicked.connect( self.pushButton_pg1_gp1_1_clicked) self.UI.pushButton_pg1_gp1_2.clicked.connect( self.pushButton_pg1_gp1_2_clicked) self.UI.pushButton_pg1_gp1_3.clicked.connect( self.pushButton_pg1_gp1_3_clicked) self.UI.pushButton_pg1_gp2_1.clicked.connect( self.pushButton_pg1_gp2_1_clicked) self.UI.pushButton_pg1_gp2_2.clicked.connect( self.pushButton_pg1_gp2_2_clicked) self.UI.pushButton_pg1_gp2_3.clicked.connect( self.pushButton_pg1_gp2_3_clicked) self.UI.pushButton_pg1_gp2_4.clicked.connect( self.pushButton_pg1_gp2_4_clicked) self.UI.pushButton_pg1_gp2_5.clicked.connect( self.pushButton_pg1_gp2_5_clicked) self.UI.stackedWidget.setCurrentIndex(2) self.show() logindialog = logindialogue() if logindialog.exec_(): self.IPaddress = logindialog.IPaddress self.account = logindialog.account self.password = logindialog.password else: self.close() def action_mn1_1_triggered(self): """主菜单注销""" self.UI.stackedWidget.setCurrentIndex(2) logindialog = logindialogue() if logindialog.exec_(): self.IPaddress = logindialog.IPaddress self.account = logindialog.account self.password = logindialog.password else: self.close() def action_mn2_1_triggered(self): """主菜单,产品,管理""" self.UI.stackedWidget.setCurrentIndex(0) self.UI.groupBox_pg1_2.setDisabled(True) db = QSqlDatabase.addDatabase('QMYSQL') db.setHostName(self.IPaddress) db.setUserName(self.account) db.setPassword(self.password) db.setDatabaseName('project') db.open() self.standarditemmodel = QStandardItemModel() for i in db.tables(): t = QStandardItem(i) t.setTextAlignment(Qt.AlignCenter) self.standarditemmodel.appendRow(t) self.UI.listView_pg1_gp1_1.setModel(self.standarditemmodel) db.close() def action_mn2_2_triggered(self): """主菜单,产品,分析""" self.UI.stackedWidget.setCurrentIndex(1) def pushButton_pg1_gp1_1_clicked(self): """第0页,第一组,删除按钮""" selectionmodel = self.UI.listView_pg1_gp1_1.selectionModel() modelindexlist = selectionmodel.selectedRows() for i in modelindexlist: reply = QMessageBox.question(self, "提示", "确定要删除" + i.data() + "产品的所有数据", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: query = QSqlQuery() query.exec("drop table " + i.data()) self.standarditemmodel.removeRow(i.row()) def pushButton_pg1_gp1_2_clicked(self): """第0页,第一组,新建按钮""" newproducttabledialog = newproducttabledialogue( self.IPaddress, self.account, self.password) if newproducttabledialog.exec_(): db = QSqlDatabase.addDatabase('QMYSQL') db.setHostName(self.IPaddress) db.setUserName(self.account) db.setPassword(self.password) db.setDatabaseName('project') db.open() self.standarditemmodel = QStandardItemModel() for i in db.tables(): t = QStandardItem(i) t.setTextAlignment(Qt.AlignCenter) self.standarditemmodel.appendRow(t) self.UI.listView_pg1_gp1_1.setModel(self.standarditemmodel) db.close() self.UI.groupBox_pg1_2.setDisabled(True) def pushButton_pg1_gp1_3_clicked(self): """第0页,第一组,查询按钮""" keyword = str(self.UI.lineEdit_pg1_gp1_1.text()) db = QSqlDatabase.addDatabase('QMYSQL') db.setHostName(self.IPaddress) db.setUserName(self.account) db.setPassword(self.password) db.setDatabaseName('project') db.open() self.standarditemmodel = QStandardItemModel() for i in db.tables(): if search(keyword, i): t = QStandardItem(i) t.setTextAlignment(Qt.AlignCenter) self.standarditemmodel.appendRow(t) self.UI.listView_pg1_gp1_1.setModel(self.standarditemmodel) db.close() def listView_pg1_gp1_1_clicked(self, index): """"第0页,第一组,列表被点击""" self.UI.groupBox_pg1_2.setDisabled(False) self.UI.groupBox_pg1_2.setTitle(index.data() + '数据:') self.UI.comboBox_pg1_gp2_1.clear() self.sqltablemodel = QSqlTableModel() self.sqltablemodel.setEditStrategy(QSqlTableModel.OnManualSubmit) self.sqltablemodel.setTable(index.data()) self.sqltablemodel.select() for i in range(self.sqltablemodel.columnCount()): self.UI.comboBox_pg1_gp2_1.addItem( self.sqltablemodel.headerData(i, Qt.Horizontal)) self.UI.tableView_pg1_gp2_1.setModel(self.sqltablemodel) def pushButton_pg1_gp2_1_clicked(self): """第0页,第二组, 增加按钮""" record = self.sqltablemodel.record() self.sqltablemodel.insertRecord(self.sqltablemodel.rowCount(), record) def pushButton_pg1_gp2_2_clicked(self): """第0页,第二组, 删除按钮""" selectionmodel = self.UI.tableView_pg1_gp2_1.selectionModel() modelindexlist = selectionmodel.selectedRows() for i in modelindexlist: self.sqltablemodel.removeRow(i.row()) def pushButton_pg1_gp2_3_clicked(self): """第0页,第二组, 确定按钮""" if self.sqltablemodel.submitAll(): QMessageBox.information(self, '提示', '提交成功') else: QMessageBox.warning(self, '错误', 'ID相同,提交失败') def pushButton_pg1_gp2_4_clicked(self): """第0页,第二组, 取消按钮""" self.sqltablemodel.revertAll() self.sqltablemodel.submitAll() def pushButton_pg1_gp2_5_clicked(self): """第0页,第二组, 查找按钮""" if len(self.UI.lineEdit_pg1_gp2_1.text()): filterword = self.UI.comboBox_pg1_gp2_1.currentText( ) + ' = ' + self.UI.lineEdit_pg1_gp2_1.text() self.sqltablemodel.setFilter(filterword) self.sqltablemodel.select() else: self.sqltablemodel.setFilter('') self.sqltablemodel.select()
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)