2016-10-02 14 views
0

私は以前同様の質問をしましたが、結果がうまくいかず、理由がわかりません。QTableWidgetからユーザーが編集したデータをどのように取得するのですか(PythonのPython)

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

そして、次の関数を追加します:

def log_change(self): 
    self.changed_items.add(self.item) 
    print(self.item) 
ザ・追加するコードは、この関数の最後に(正確にインデント)ことを示唆した

def click_btn_printouts(self): 
    self.cur.execute("""SELECT 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.search_results() 
    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, self.item in enumerate(self.all_data): 
     FullName = QtGui.QTableWidgetItem(str(self.item[0])) 
     PreviouslyMailed = QtGui.QTableWidgetItem(str(self.item[1])) 
     LearnersDate = QtGui.QTableWidgetItem(str(self.item[2])) 
     RestrictedDate = QtGui.QTableWidgetItem(str(self.item[3])) 
     DefensiveDate = QtGui.QTableWidgetItem(str(self.item[4])) 
     NextMail = QtGui.QTableWidgetItem(str(self.item[5])) 
     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]) 

:ここ は、元のコードでした

予想されるプリントが編集済みのデータでしたが、編集前のデータが表示されます。

QTableViewとQtSqlは、SQLクエリで使用し、選択したすべてのレコードをリストに入れ、特定の列が編集されないようにすることができない限り使用できません。もし誰かがこれをやる方法を知っていれば、それは素晴らしいことです。私は現時点ですべての文書を読む時間がありません。

私がしたいのは、ユーザーがQTableWidgetからデータを変更し、その変更されたデータをレコードとして取得できるようにすることです。

私の最終目標はQTableWidgetのsetEditStrategy(QSqlTableModel.OnManualSubmit)に相当します。

私はしばらくの間これを理解しようとしていましたが、私はそれを整理しておきたいのですが、それはクライアントのためにこのプログラムを終了するために必要な最後のことです。

+0

[他の投稿]で受け入れられた回答(http://stackoverflow.com/questions/39742199/how-do-i-get-the-information-that-the-user-has-changed-in-あなたが '.add(self.item)'を引用している間に 'def log_change(self、item):' 'self.changed_items.add(item)'と言っていました。もちろん違います。 – ImportanceOfBeingErnest

+0

まだ同じであるはずです。私は自分のプログラムで動作するようにitemをself.itemに変換しました。 –

+0

古いデータを取得するのは、以前の投稿の答えの代わりに 'self.item'を使うからです。 – ImportanceOfBeingErnest

答えて

1

最小限の作業の例がないと常に答えにくいので、自分で作成してother postの提案を変更して、変更された項目のテキストとその位置を表の中に出力するようにします。

# runs with Python 2.7 and PyQt4 
from PyQt4 import QtGui, QtCore 
import sys 


class App(QtGui.QMainWindow): 

    def __init__(self, parent=None): 
     super(App, self).__init__(parent) 
     self.setMinimumSize(600,200) 

     self.all_data = [["John", True, "", 24], 
         ["Joe", False, "05671", 13], 
         ["Johnna", True, "07145", 44] ] 

     self.mainbox = QtGui.QWidget(self) 
     self.layout = QtGui.QVBoxLayout() 
     self.mainbox.setLayout(self.layout) 
     self.setCentralWidget(self.mainbox) 

     self.table = QtGui.QTableWidget(self) 
     self.layout.addWidget(self.table) 

     self.button = QtGui.QPushButton('Update',self) 
     self.layout.addWidget(self.button) 

     self.click_btn_printouts() 
     self.button.clicked.connect(self.update) 

    def click_btn_printouts(self): 

     self.table.setRowCount(len(self.all_data)) 
     self.tableFields = ["Name", "isSomething", "someProperty", "someNumber"] 
     self.table.setColumnCount(len(self.tableFields)) 
     self.table.setHorizontalHeaderLabels(self.tableFields) 
     self.checkbox_list = [] 
     for i, self.item in enumerate(self.all_data): 
      FullName = QtGui.QTableWidgetItem(str(self.item[0])) 
      FullName.setFlags(FullName.flags() & ~QtCore.Qt.ItemIsEditable) 
      PreviouslyMailed = QtGui.QTableWidgetItem(str(self.item[1])) 
      LearnersDate = QtGui.QTableWidgetItem(str(self.item[2])) 
      RestrictedDate = QtGui.QTableWidgetItem(str(self.item[3])) 

      self.table.setItem(i, 0, FullName) 
      self.table.setItem(i, 1, PreviouslyMailed) 
      self.table.setItem(i, 2, LearnersDate) 
      self.table.setItem(i, 3, RestrictedDate) 

     self.changed_items = [] 
     self.table.itemChanged.connect(self.log_change) 

    def log_change(self, item): 
     self.table.blockSignals(True) 
     item.setBackgroundColor(QtGui.QColor("red")) 
     self.table.blockSignals(False) 
     self.changed_items.append(item) 
     print item.text(), item.column(), item.row() 

    def update(self): 
     print "Updating " 
     for item in self.changed_items: 
      self.table.blockSignals(True) 
      item.setBackgroundColor(QtGui.QColor("white")) 
      self.table.blockSignals(False) 
      self.writeToDatabase(item) 

    def writeToDatabase(self, item): 
     text, col, row = item.text(), item.column(), item.row() 
     #write those to database with your own code 


if __name__=='__main__': 
    app = QtGui.QApplication(sys.argv) 
    thisapp = App() 
    thisapp.show() 
    sys.exit(app.exec_()) 

これ以降の問題を参照する場合は、この例を使用してください。

+0

ありがとうございました。ほんとうにありがとう。 –

+0

ところで、それは完全に動作します。 –

関連する問題