You can also make a common widget base class if you want in your project (which may be what you want I think). So make a ‘MyModuleWidget : ModuleWidget’ and have it have a method like ‘Bus *getBus()’ where ‘Bus *’ is an instance of the communication bus thing you sketched out.
Then for each of your widgets have them implement something like ‘Busable’ interface. So you then write
Struct myWidget : app::WhateverWidget, Busable
Then in your module code you can do
Auto wid = createParam<MyWidget>(...)
You get the idea (sorry for the bad autocorrect - I’m on an ipad). Then you are entirely in widget space, you don’t have to reference module, and you use the parent ModuleWidget as the holder for your inter communication bus. I think that’s the pattern you are looking for.
Like I said, I haven’t seen someone need or use that pattern exactly like that. Most things seem module intermediated. But if you want non-module-intermediated widget converasation I think you will end up with a solution like that (just not in gross pseudocode)