Exemple #1
0
    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)
Exemple #2
0
 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)
Exemple #3
0
    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()
Exemple #4
0
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
Exemple #6
0
    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
Exemple #7
0
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()
Exemple #10
0
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)
Exemple #11
0
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)
Exemple #12
0
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)
Exemple #15
0
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)
Exemple #17
0
# Устанавливаем соединение с базой данных
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_())
Exemple #18
0
        '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_())
Exemple #19
0
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)
Exemple #20
0
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)
Exemple #21
0
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)
Exemple #22
0
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
Exemple #23
0
                                   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_())
Exemple #24
0
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)
Exemple #25
0
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()
Exemple #26
0
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)
Exemple #27
0
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
Exemple #28
0
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)
Exemple #29
0
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)