I have implemented the proxi model in the view itself, because only that view needs that trick with an artificial index to display the rootindex.
I create the proxi model when I call setModel(). SetModel() is called with the source model.

Qt Code:
  1. void FileSysSelectView::setModel(QAbstractItemModel * model)
  2. {
  3.  
  4. m_sourceModel = static_cast<FileSysSelectModel *> (model);
  5. m_proxiModel = new QSortFilterProxyModel();
  6. m_proxiModel->setSourceModel(m_sourceModel);
  7.  
  8. QTreeView::setModel(m_proxiModel);
  9.  
  10. // Limit the view to the File name Column (1st Column)
  11. for (int i(1); i < m_proxiModel->columnCount(QModelIndex::QModelIndex()); i++) this->setColumnHidden(i,true);
  12. }
To copy to clipboard, switch view to plain text mode 
At that point everything works well, my proxi model sits bettween my view and the source model, and it acts transparently.
I try to insert the artificial index when I call setRootIndex().

For exemple, if I want to show what is under C:/, I have to do the folowing:

before:
- root
--C:\
---Program Files
---Windows
---Users
--D:\
--X:\

after:
- root
-- artififical index
---C:\
----Program Files
----Windows
---Users
--D:\
--X:\
Qt Code:
  1. void FileSysSelectView::setRootIndex(const QModelIndex & index)
  2. {
  3.  
  4. // insert a new index under the specified root index.
  5. QModelIndex idxParent = m_proxiModel->mapFromSource(index.parent());
  6. m_proxiModel->insertRow(0, idxParent);
  7.  
  8. // move the the root index under the new index
  9. QModelIndex idxNew = m_proxiModel->index(0,0, idxParent);
  10. QModelIndex idx = m_proxiModel->mapFromSource(index);
  11. int idxPosition = idx.row();
  12. m_proxiModel->moveRow(idxParent, idxPosition, idxNew, 0);
  13. QTreeView::setRootIndex(idx);
  14. }
To copy to clipboard, switch view to plain text mode 
Actually int idxPosition = idx.row() at line 11 doesn't work for the reasons I mentioned earlier in the thread. The underlying QFileSystemModel needs to be populated before idx.row() is called. That means I have to call fetchMore() and check for directroyLoaded() signal in that situation too...