дело оказалось даже не в этом, т.к. предыдущий код тоже на самом деле не помог. при более пристальном изучении внутренностей QtSingleApplication я заметил, что
C++ (Qt)
connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&)));
совершается в конструкторе, а
C++ (Qt)
connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow()));
только в setActivationWindow(), т.е. позже. у меня в приложении было
C++ (Qt)
setActivationWindow(_mainWindow);
connect(this, SIGNAL(messageReceived(const QString &)), _mainWindow, SLOT(loadFile(const QString &)));
значит когда отправлялся сигнал messageReceived(), то сначала грузился файл, вылазил месседжбокс, а потом уже только шёл вызов activateWindow() - видно тут собака и зарылась. также иногда наблюдал артефакты с появлением окна (на мгновение появлялось и исчезало, или месседжбокс 2 раза подряд вылезал), но я это списывал на особенности винды, а теперь понял что к чему
в итоге пришлось чуть схитрить, чтобы загружать файл после показа окна:
C++ (Qt)
setActivationWindow(_mainWindow);
connect(this, SIGNAL(messageReceived(const QString &)), SLOT(setParam(const QString &))); // просто сохраняем параметр
...
void Application::activateWindow()
{
QtSingleApplication::activateWindow();
_mainWindow->loadFile(_param);
}
и теперь всё отрабатывает идеально.