I tested your code on PostgreSQL using C++ and got correct results (I used a query that returns a single record, looks like you did the same). May be there is a bug in SqlLite driver or in PyQt4?

Test program
Qt Code:
  1. int main(int argc, char* argv[])
  2. {
  3. QCoreApplication app(argc, argv);
  4.  
  5. QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
  6. db.setDatabaseName("pm");
  7.  
  8. bool ok = db.open();
  9. if(! ok) {
  10. qDebug() << db.lastError().text();
  11. return 1;
  12. }
  13.  
  14. QSqlQuery query;
  15. if(query.exec("select * from pm.portfolio where id = 1")) {
  16. qDebug() << "is_active" << query.isActive();
  17. qDebug() << "is_select" << query.isSelect();
  18. qDebug() << "is_valid" << query.isValid();
  19.  
  20. qDebug() << "";
  21. qDebug() << "seek:" << query.seek(0);
  22. qDebug() << "is_valid" << query.isValid();
  23.  
  24. qDebug() << "";
  25. qDebug() << "seek:" << query.seek(0);
  26. qDebug() << "is_valid" << query.isValid();
  27.  
  28. qDebug() << "";
  29. qDebug() << "next" << query.next();
  30. qDebug() << "is_valid" << query.isValid();
  31.  
  32. qDebug() << "";
  33. qDebug() << "seek:" << query.seek(0);
  34. qDebug() << "is_valid" << query.isValid();
  35. }
  36. else {
  37. qDebug() << query.lastError();
  38. }
  39. }
To copy to clipboard, switch view to plain text mode 

Result
is_active true
is_select true
is_valid false

seek: true
is_valid true

seek: true
is_valid true

next false
is_valid false

seek: true
is_valid true