0

I have the fololloiwng code anf my query work fine:

    ###initilize Objects
    self.dbObj = DbAbsLayer()
    self.tableObj = MaterialsTable(dict()) 

    ####making queries, one for count row, another for result row
    query = self.dbObj.session.query(MaterialsTable)
    rowCounter = self.dbObj.session.query(MaterialsTable)
    for attr , val in tmpDict.items():
        query = query.filter(getattr(MaterialsTable,attr).like("%%%s%%" % val)).all()
        rowCounter = rowCounter.filter(getattr(MaterialsTable,attr).like("%%%s%%" % val)).count()
    ##### commit my queries
    self.dbObj.session.commit()
    ####setting up my QtableWidget 
    searchFrameObject.tableWidget.setRowCount(rowCounter)
    searchFrameObject.tableWidget.setColumnCount(5)
    ######inserting into QtableWidget
    for row in range(rowCounter):
        for result in query:
            item = QtGui.QTableWidgetItem(_fromUtf8(result.name))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,0,item)

            item = QtGui.QTableWidgetItem(_fromUtf8(integerToPersian(result.bought_price)))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,1,item)

            item = QtGui.QTableWidgetItem("date")#result.bought_date)
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,2,item)


            item = QtGui.QTableWidgetItem(_fromUtf8(integerToPersian(result.stock)))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,3,item)
            print result.stock
            print integerToPersian(result.stock)
            item = QtGui.QTableWidgetItem(_fromUtf8(integerToPersian(result.minimum_bound)))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,4,item)
            print result.minimum_bound

In my loop i print result.stock and result.minimum.bound i can see everything that i have in DB can i see in PHPMyAdmin, But when i add to QTableWidget, i see added last result.

My question is , how can i add every result into QTableWidget?

László Papp
  • 51,870
  • 39
  • 111
  • 135
PersianGulf
  • 2,845
  • 6
  • 47
  • 67
  • Unfortunately, i found http://www.marcogiordanotd.com/blog/uncategorized/looping-with-qtablewidgetitem Do you have any idea? Or did you use setItem in loop before? – PersianGulf Sep 10 '13 at 07:24

1 Answers1

1

This is what you doing wrong:

for row in range(rowCounter):
    for result in query:

You write all results from query over the previous result in every row, so that is why you can see only last result.

Possible solution (assuming query is array):

for row in range(rowCounter):
    result = query[row]
    item = ....
    .....

that way every result contained in query will be written in one (new) row (5 columns). You need to check if your rowCounter is the same length like your query (it should be if you want to show one result per row)

If you still do not understand what is wrong, feel free to ask :)

Aleksandar
  • 3,541
  • 4
  • 34
  • 57
  • `print result.stock` print 1 2 3 for each three loop because for each result.stock i stored 1 , 2 and 3 in DB, be sure my query is true. – PersianGulf Sep 10 '13 at 07:48
  • ` for result in query[row]: TypeError: 'MaterialsTable' object is not iterable` ,When i test with rowCounter i get true result. – PersianGulf Sep 10 '13 at 07:54
  • Ofcourse it prints "1 2 3", but when row = 0, you write result (one with result.stock=1) in row. Result is in for loop, so it will write second result (one with result.stock=2) in the same row. Once again, result (one with result.stock=3) will be written over last one but also in the same row. So, it will print "1 2 3" but only result with result.stock=3 will be shown in tableWidget. – Aleksandar Sep 10 '13 at 08:00
  • i did not say to loop result through `query[row]` , I said `result = query[row]` . Look at my answer "Possible solution" – Aleksandar Sep 10 '13 at 08:03
  • just change that one line, it should work (populate one result per one row). also, `rowCounter` should be length of `query` (as I can see you are populating table only with results) – Aleksandar Sep 10 '13 at 08:15