Er kennt nur den Namen des Typs, weiß mit dem Typen selber aber nichts anzufangen -> in deinem Header hast du nur ne forward declaration. Für die Definition der UI-Klasse musst du noch den passenden Header einbinden.
Prinzipiell würde ich das aber nicht so machen.
1) Du erzeugst eine weitere Abhängigkeit. Das ist aus Design-Sicht schlecht und erzeugt bei Änderungen an der Ui unnötige aber notwendige Neukompilierungen.
2) Das ui ist das "Herz" deines Widgets. Du reichst das einfach so weiter, gibst dein Innerstes Preis. Jeder, dem du das gestattest, kann mit dem Widget treiben was er will! Uneingeschränkt, unkontrolliert! Ebenfalls schlecht aus Design-Sicht.
Die Lösung geht über neue Methoden: Anstatt direkt auf das Label zuzugrifen, bietest du in der Widget-Klasse einen setter an (setIpAddress). Idealerweise machst du das über SIGNAL/SLOT, dann müssen sich die beiden Typen gar nicht kennen! (Wieder ein #include weniger in CCOnnect)