Павел_Но проблема в том, что виртуальные функции нельзя использовать в конструкторах.
Это почему?
попробуйте вызвать виртуальную ф-цию перегруженную в конструкторе предка, но выполняющуюся в конструкторе потомка.
C++ (Qt)
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0) : QMainWindow( parent)
    {
	myTest();
    }
    virtual void myTest()
    {
	qWarning("void MainWindow::myTest()");
    }
};
 
class MainWindow2 : public MainWindow
{
    Q_OBJECT
public:
    void myTest()
    {
	qWarning("void MainWindow2::myTest()");
    }
};
 
по вашей логике - раз они работаю то при создание экземпляра MainWindow2 должно вывестись "void MainWindow2::myTest()", но выведется
"void MainWindow::myTest()" т.к. виртуальные ф-ции можно использовать в к-рах, 
но они не будут работать как виртуальные - это действительно ограничение C++;
aljeshisheдумаю есть решения вашей проблемы
1) использовать отдельные ui для разных окон - в которых все Action руками расставлены по элементам меню как надо (можно использовать UILoader а можно и старым принципом)
2) сделать ф-цию 
init для базового окна и в ней а не в конструкторе вызывать setupUi -а уже в наследниках вызывать этот init тогда когда удобнее для создания элементов меню