Всё потому, что тролли не предполагали, что в качестве редактора ячейки будет использоваться диалог.
У них всё заточено на то, что редактор располагается на вью.
И, имхо, правильно делают, т.к. совершенно не очевидно, что по двойному нажатию на ячейку должен появиться диалог.
Мало того, на не линуксе диалог всегда будет ненативный и будет прятаться если вью потеряет фокус.
Для таких целей обычно делают редактор вида
[______][..].
А теперь почему fileDialog->result() всегда равен 0.
Дело в том, setModelData() вызывается сразу при потере фокуса или при закрытии редактора, а установка результата в диалоге уже после того как отработает закрытие, т.е. уже после setModelData(). Если хотите оставить использовать диалог в качестве редактора, то нужно отнаследоваться от QFileDialog и перегрузить done( int r ):
C++ (Qt)
void YourFSDlg::done( int r )
{
setResult( r );
QFileDialog::done( r );
}