2016-09-28 2 views
1

내 GUI에 표가 나타납니다. 사용자는 GUI에서이 테이블을 편집 할 수 있습니다. 편집 된 모든 정보를 얻고 데이터베이스에서 업데이트하려면 어떻게합니까? 사용자는 데이터베이스로 업데이트 할 각 행의 확인란을 선택하므로 업데이트가 필요한 모든 행의 목록이 있습니다. 나는 각 튜플이 ID 필드가 변경되지 않은 상태에서 업데이트되어야하는 새로운 값의 행인 튜플 목록을 원합니다. 사용자가 일부 필드를 편집 할 수 없도록 만드는 방법을 알고 싶습니다.Python과 Python의 테이블에서 사용자가 변경 한 정보를 얻으려면 어떻게해야합니까?

def click_btn_mailouts(self): 
    self.screen_name = "mailouts" 
    self.cur.execute("""SELECT s.StudentID, s.FullName, m.PreviouslyMailed, m.nextMail, m.learnersDate, m.RestrictedDate, m.DefensiveDate FROM 
         StudentProfile s LEFT JOIN Mailouts m ON s.studentID=m.studentID""") 
    self.all_data = self.cur.fetchall() 

    self.table.setRowCount(len(self.all_data)) 
    self.tableFields = ["Check","Full name","Previously mailed?","Next mail","learnersDate","Restricted date","Defensive driving date"] 
    self.table.setColumnCount(len(self.tableFields)) 
    self.table.setHorizontalHeaderLabels(self.tableFields) 
    self.checkbox_list = [] 
    for i, item in enumerate(self.all_data): 
     FullName = QtGui.QTableWidgetItem(str(item[1])) 
     PreviouslyMailed = QtGui.QTableWidgetItem(str(item[2])) 
     LearnersDate = QtGui.QTableWidgetItem(str(item[3])) 
     RestrictedDate = QtGui.QTableWidgetItem(str(item[4])) 
     DefensiveDate = QtGui.QTableWidgetItem(str(item[5])) 
     NextMail = QtGui.QTableWidgetItem(str(item[6])) 
     self.table.setItem(i, 1, FullName) 
     self.table.setItem(i, 2, PreviouslyMailed) 
     self.table.setItem(i, 3, LearnersDate) 
     self.table.setItem(i, 4, RestrictedDate) 
     self.table.setItem(i, 5, DefensiveDate) 
     self.table.setItem(i, 6, NextMail) 
     chkBoxItem = QtGui.QTableWidgetItem() 
     chkBoxItem.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled) 
     chkBoxItem.setCheckState(QtCore.Qt.Unchecked) 
     self.checkbox_list.append(chkBoxItem) 
     self.table.setItem(i, 0, self.checkbox_list[i]) 

"""here is the format that I have for the edit function""" 

def click_btn_edit(self): 
    checkedRows = [] 
    for i, checkbox in enumerate(self.checkbox_list): 
     if checkbox.checkState() == QtCore.Qt.Checked: 
      checkedRows.append(i) 
      """as the list itterates, if the checkbox item is ticked, 
      it passes through the if statement, otherwise it is ignored. 
      checkedRows becomes a list of all the indexes in the table where 
      an edit needs to be made"""     

그래서 기본적으로 나는 변경이 된 인덱스의 목록 주어진 GUI에 QTableWidget에서 변경을 얻는 방법을 알고, 어떻게 든 데이터베이스에 업데이트 된 변경 사항을 얻을 필요가있다. 또한 사용자가 일부 필드를 편집하지 못하도록하는 방법을 알고 있으면 데이터베이스를 망칠 수 있으므로 도움이됩니다.

+1

데이터베이스를 수동으로 조작해야합니까? PyQt는 데이터베이스 연결'QtSql.QSqlDatabase'를 정의 할 수있는'QtSql'이라는 훌륭한 인터페이스를 제공합니다. 이것은 데이터베이스 모델'QtSql.QSqlTableModel'에 의해 관리되고'QtGui.QTableView'에 연결됩니다. 이러한 방식으로 QTableView의 변경 사항은 데이터베이스 쿼리를 작성할 필요없이 데이터베이스에 직접 반영됩니다. 좋은 시작점은이 튜토리얼이 될 것입니다. https://www.tutorialspoint.com/pyqt/pyqt_database_handling.htm – ImportanceOfBeingErnest

+0

저는 PyQT에서 독학하기를 강요합니다. 그래서 나는 이것이 존재했다는 것을 몰랐습니다. 내 프로그램은 이미 QTableWidget에 너무 의존적이다. QTableWidget에 대한 편집 전략을 설정하거나 사용자가 테이블에서 편집 한 데이터에 액세스 할 수있는 방법이 있습니까? –

+0

나는 아직도 QtSql 인터페이스를 사용하는 것이 가치 있다고 생각한다. QTableWidget은 QTableView를 상속하므로 많은 불필요한 줄을 삭제하는 것 이외에는 코드를 많이 변경해야한다고 상상할 수는 없습니다. – ImportanceOfBeingErnest

답변

0

몇 가지 다른 작업을 수행 할 수 있습니다.

편집을 방지하기 위해, 당신은 당신이 사용자가 원본 데이터 (즉 self.all_data)를 저장하고 마치

FullName.setFlags(FullName.flags() & ~Qt.ItemIsEditable) 

편집하고 싶지 않은 항목에 대한 편집 플래그를 제거 할 수 있습니다. 선택한 표 셀의 데이터를 원본 데이터와 비교하고 변경된 필드 만 업데이트하면됩니다.

또한 당신을 테이블 위젯의 itemChanged 신호에 연결하고 당신이 원하는 얼마나 많은 컨트롤에 따라

... 
    self.changed_items = set() 
    self.table.itemChanged.connect(self.log_change) 

def log_change(self, item): 
    self.changed_items.add(item) 

또는 마지막 새로 고침 이후에 변경된 모든 인덱스의 실행 목록을 유지할 수 이 모든 작업을 수행하려면 QItemDelegate을 만들 수도 있습니다.

+0

첫 번째 제안을 시도했을 때 오류가 발생했습니다 : AttributeError : 'QTableWidgetItem'객체에 'setItemFlags'속성이 없습니다. 나는 함수 'click_btn_mailouts()'의 맨 아래에 넣었습니다 –

+0

@PaulJackways updated –

+0

'setItemFlags'에서 'item'을 제거하고 작동했습니다. 감사합니다. –

관련 문제