PyQt5不同的连接取决于呼叫风

2024-07-02 11:20:46 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在开发一个用户可以存储、管理和跟踪维修的应用程序。 应用程序连接到MsSQL数据库以检索正在进行的修复。应用程序的很大一部分是搜索结果窗口。此窗口是一个共享UI,它基于父窗口连接其按钮

我想知道是否有更简单的方法来连接按钮,双击(事件)。目前,我在启动窗口时指定父窗口,子窗口通过执行父窗口的name函数来连接按钮,以确定按钮需要如何连接

这种方法可行,但我觉得我把事情复杂化了

这是SearchResults窗口:

class SearchResultsWindow():
def __init__(self, sqlstring, *sqlparams, parent):
    #######################  CREATE SEARCH RESULT WINDOW  #######################
    self.window = QtWidgets.QDialog()
    self.ui = Ui_Search_Results_Window()
    self.ui.setupUi(self.window)

    #######################  DEFINING VARIABLES  #######################
    self.sqlstring = sqlstring
    self.sqlparams = sqlparams
    self.parent = parent

    #######################  PARENT DEVIATIONS  #######################
    if self.parent.__name__() == 'SearchRepairWindow':
        #######################  SET CONNECTIONS  #######################
        self.ui.New_PushButton.clicked.connect(lambda: AddRepairWindow()) #NEW PUSHBUTTON
        self.ui.Table_TableWidget.doubleClicked.connect(self.edit_repair) #TABLE DOUBLE CLICK
        self.ui.Edit_PushButton.clicked.connect(self.edit_repair) #EDIT PUSHBUTTON
        self.ui.SuperSearch_PushButton.clicked.connect(self.super_search_repair) #SUPER SEARCH PUSHBUTTON
        #######################  ENABLE/DISABLE BUTTONS  #######################
        self.ui.Select_PushButton.setEnabled(False)
        #######################  VARIABLES  #######################
        self.ui.SuperSearch_LineEdit.setText(self.parent.ui.SuperSearch_LineEdit.text())

    elif self.parent.__name__() == 'AddRepairWindow':
        #######################  SET CONNECTIONS  #######################
        self.ui.New_PushButton.clicked.connect(lambda: AddCustomerWindow()) #NEW PUSHBUTTON
        self.ui.Table_TableWidget.doubleClicked.connect(self.select_customer) #TABLE DOUBLE CLICK
        self.ui.Select_PushButton.clicked.connect(self.select_customer) #SELECT PUSHBUTTON
        self.ui.Edit_PushButton.clicked.connect(self.edit_customer) #EDIT PUSHBUTTON
        self.ui.SuperSearch_PushButton.clicked.connect(self.super_search_customer) #SUPER SEARCH PUSHBUTTON
        #######################  ENABLE/DISABLE BUTTONS  #######################
        #######################  VARIABLES  #######################
        self.ui.SuperSearch_LineEdit.setText(self.parent.ui.SuperSearch_LineEdit.text())

    elif self.parent.__name__() == 'SearchCustomerWindow':
        #######################  SET CONNECTIONS  #######################
        self.ui.New_PushButton.clicked.connect(lambda: AddCustomerWindow()) #NEW PUSHBUTTON
        self.ui.Table_TableWidget.doubleClicked.connect(self.edit_customer) #TABLE DOUBLE CLICK
        self.ui.Edit_PushButton.clicked.connect(self.edit_customer) #EDIT PUSHBUTTON
        self.ui.SuperSearch_PushButton.clicked.connect(self.super_search_customer) #SUPER SEARCH PUSHBUTTON
        #######################  ENABLE/DISABLE BUTTONS  #######################
        self.ui.Select_PushButton.setEnabled(False) #SELECT PUSHBUTTON
        #######################  VARIABLES  #######################
        self.ui.SuperSearch_LineEdit.setText(self.parent.ui.SuperSearch_LineEdit.text())

    elif self.parent.__name__() == 'EditCustomerWindow':
        #######################  SET CONNECTIONS  #######################
        self.ui.Table_TableWidget.doubleClicked.connect(lambda: DetailsRepairWindow(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('CustomerID')).text(), self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('RepairID')).text()))
        self.ui.Select_PushButton.clicked.connect(lambda: DetailsRepairWindow(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('CustomerID')).text(), self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('RepairID')).text()))
        self.ui.Edit_PushButton.clicked.connect(lambda: DetailsRepairWindow(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('CustomerID')).text(), self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('RepairID')).text()))
        #######################  ENABLE/DISABLE BUTTONS  #######################
        self.ui.SuperSearch_PushButton.setEnabled(False)
        self.ui.SuperSearch_LineEdit.setEnabled(False)
        self.ui.New_PushButton.setEnabled(False)
        #######################  CHANGE LABELS  #######################
        self.ui.Select_PushButton.setText('Details')

    elif self.parent.__name__() == 'AddRentWindow':
        #######################  SET CONNECTIONS  #######################
        self.ui.New_PushButton.clicked.connect(lambda: AddCustomerWindow()) #NEW PUSHBUTTON
        self.ui.Table_TableWidget.doubleClicked.connect(self.select_customer) #TABLE DOUBLE CLICK
        self.ui.Select_PushButton.clicked.connect(self.select_customer) #SELECT PUSHBUTTON
        self.ui.Edit_PushButton.clicked.connect(self.edit_customer) #EDIT PUSHBUTTON
        self.ui.SuperSearch_PushButton.clicked.connect(self.super_search_customer) #SUPER SEARCH PUSHBUTTON
        #######################  ENABLE/DISABLE BUTTONS  #######################
        #######################  VARIABLES  #######################
        self.ui.SuperSearch_LineEdit.setText(self.parent.ui.SuperSearch_LineEdit.text())

    #######################  CONNECT COMMON BUTTONS  #######################
    self.ui.Cancel_PushButton.clicked.connect(lambda: self.window.close())
    self.ui.Export_PushButton.clicked.connect(self.export)

    #######################  EXECUTE QUERY WITH PROVIDED STRING & PARAMETERS  #######################
    conn.execute(self.sqlstring, self.sqlparams) # EXECUTE QUERY
    self.headers = [columnname[0] for columnname in conn._cursor.description] # GET COLUMN NAMES OF CURSOR

    if self.fill_table(conn.fetchall()): # IF FILL_TABLE RETURNS TRUE --> SHOW WINDOW
        self.window.exec()

#######################  CUSTOMER FUNCTIONS  #######################
def select_customer(self):
    if self.ui.Table_TableWidget.currentRow() != -1:
        if self.parent.__name__() == 'AddRepairWindow': 
            self.parent.set_customer(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), customer_headers.index('CustomerID')).text(), self)
        elif self.parent.__name__() == 'AddRentWindow':
            self.parent.set_customer(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), customer_headers.index('CustomerID')).text(), self)
    else:
        PopupWindow('No client selected!', 'No client selected!', QtWidgets.QMessageBox.Information)

def edit_customer(self):
    if self.ui.Table_TableWidget.currentRow() != -1:
        if self.parent.__name__() == 'AddRepairWindow':
            EditCustomerWindow(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), customer_headers.index('CustomerID')).text())
            self.refresh_table()
        elif self.parent.__name__() == 'SearchCustomerWindow':
            EditCustomerWindow(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), customer_headers.index('CustomerID')).text())
            self.refresh_table()
        elif self.parent.__name__() == 'AddRentWindow':
            EditCustomerWindow(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), customer_headers.index('CustomerID')).text())
            self.refresh_table()
    else:
        PopupWindow('No client selected!', 'No client selected!', QtWidgets.QMessageBox.Information)

#######################  REPAIR FUNCTIONS  #######################
def edit_repair(self):
    self.ui.Table_TableWidget.item
    if self.ui.Table_TableWidget.currentRow() != -1:
        if self.parent.__name__() == 'SearchRepairWindow':
            DetailsRepairWindow(self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('CustomerID')).text(), self.ui.Table_TableWidget.item(self.ui.Table_TableWidget.currentRow(), self.headers.index('RepairID')).text())
            self.refresh_table()
    else:
        PopupWindow('No client selected!', 'No client selected!', QtWidgets.QMessageBox.Information)

#######################  GENERAL FUNCTIONS  #######################
def refresh_table(self):
    conn.execute(self.sqlstring, self.sqlparams) #EXECUTE QUERY
    self.fill_table(conn.fetchall())

def super_search_repair(self):
    self.sqlstring = '''
    SELECT      Repairs.[Repair Number],
                Customers.Name,
                Customers.[First Name],
                Repairs.[Creation Date],
                Customers.Telephone,
                Customers.Cellphone,
                Repairs.Brand,
                Repairs.Type,
                Repairs.[Power Adapter],
                Repairs.Mouse,
                Repairs.Bag,
                Repairs.Other,
                Repairs.Password,
                Repairs.Status,
                Customers.[Primary Address],
                Customers.Postcode,
                Customers.Town,
                Customers.Email,
                Customers.CustomerID,
                Repairs.RepairID
    FROM        Repairs
    INNER JOIN  Customers
    ON          Repairs.CustomerID = Customers.CustomerID
    WHERE       Customers.Name LIKE (?) 
    OR          Customers.[First Name] LIKE (?) 
    OR          Customers.[Middle Name] LIKE (?) 
    OR          Customers.[Primary Address] LIKE (?) 
    OR          Customers.[Secondary Address] LIKE (?) 
    OR          Customers.Telephone LIKE (?) 
    OR          Customers.Cellphone LIKE (?) 
    OR          Customers.Email LIKE (?)'''

    self.sqlparams = (
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%")

    conn.execute(self.sqlstring, self.sqlparams)
    self.fill_table(conn.fetchall())

def super_search_customer(self):
    self.sqlstring = '''
        SELECT      * 
        FROM        CUSTOMERS
        WHERE       Name LIKE (?) 
        OR          [First Name] LIKE (?) 
        OR          [Middle Name] LIKE (?) 
        OR          [Primary Address] LIKE (?) 
        OR          [Secondary Address] LIKE (?) 
        OR          Telephone LIKE (?) 
        OR          Cellphone LIKE (?) 
        OR          Email LIKE (?)'''

    self.sqlparams = (
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%",
        "%"+self.ui.SuperSearch_LineEdit.text()+"%")

    conn.execute(self.sqlstring, self.sqlparams)
    self.fill_table(conn.fetchall())

def export(self):
    fileName, _ = QtWidgets.QFileDialog.getSaveFileName(caption='Save File', directory='', filter='*.xlsx')
    if fileName:
        workbook = xlsxwriter.Workbook(fileName)
        worksheet = workbook.add_worksheet()

        header_format = workbook.add_format()
        header_format.set_border(1)
        header_format.set_bold(bold=True)

        default_format = workbook.add_format()
        default_format.set_border(1)

        for index, column in enumerate(self.headers):
            worksheet.set_column(index, index, 15)
            worksheet.write(0, index, column, header_format)

        for currentColumn in range(self.ui.Table_TableWidget.columnCount()):
            for currentRow in range(self.ui.Table_TableWidget.rowCount()):
                try:
                    text = self.ui.Table_TableWidget.item(currentRow, currentColumn).text()
                    worksheet.write(currentRow+1, currentColumn, text, default_format)
                except AttributeError:
                    pass
        workbook.close()

def fill_table(self, query_result):
    if query_result:
        #######################  SET ROWS AND COLUMNS  #######################
        self.ui.Table_TableWidget.setRowCount(len(query_result))
        self.ui.Table_TableWidget.setColumnCount(len(self.headers))

        #######################  FILL IN QTABLEWIDGET HEADERS  #######################
        for a in range(0, len(self.headers)):
            item = QtWidgets.QTableWidgetItem()
            self.ui.Table_TableWidget.setHorizontalHeaderItem(a, item)
            item.setText(self.headers[a])

        #######################  CREATE CELLS AND SET TEXT  #######################
        for row_index, row in enumerate(query_result):
            for column_index in range(0, len(self.headers)):
                self.ui.Table_TableWidget.setItem(row_index, column_index, QTableWidgetItem(str(row[column_index])))

        #######################  DECRYPT PASSWORD FIELDS #######################
        if 'Password' in self.headers:
            for row_index, row in enumerate(query_result):
                self.ui.Table_TableWidget.setItem(row_index, self.headers.index('Password'), QTableWidgetItem(decrypt_string(str(row[self.headers.index('Password')]))))

        #######################  RESIZE COLUMNS TO CONTENTS  #######################
        self.ui.Table_TableWidget.resizeColumnsToContents()

        #######################  IF QUERY IS FINISHED RETURN TRUE  #######################
        return True

    else:
        #######################  IF QUERY IS FAILS OR IS EMPTY RETURN POPUP AND FALSE  #######################
        PopupWindow('No results!','No results!', QtWidgets.QMessageBox.Information)
        self.ui.Table_TableWidget.setRowCount(0)
        return False

def __name__(self):
    '''Return name of the class'''
    return self.__class__.__name__

如果您对我的代码或我的工作方式有任何评论,请发表评论(我仍在学习Python)


Tags: textselfuiindexconnecttablecustomerparent