If the long run time is the database server determining what rows to return then there's nothing you can do to display partial results during this time. There are no rows to return and display until after this stage. Make sure you have a good query that makes best use of indexes in the data and only returns columns you need. Full table scans are bad with multi-millions of rows in a table.
If the long run time is predominantly returning the rows after the database engine has selected them then you might have some options. QSqlTableModel already does lazy retrieval of small batches (~256) from large row sets as a view (QTableView) scrolls down. Scrolling through large data sets can be tedious though. You can bundle the entire delay into a single loop after the model select() using canFetchMore() and fetchMore().
If the process is slowed by a network connect to the database server you might find some useful ideas here for asynchronous retrieval (thanks Wysota):
http://blog.wysota.eu.org/index.php/...remote-models/
Bookmarks