No to kilka uwag.. jak prosiłeś.
1. To zła praktyka stosować magiczne wartości 0, 1, 2 do oznaczania pól (puste/kółko/krzyżyk). Lepiej stosować wartości enum.
2. Funkcje są zbyt obszerne. Co oznacza że mają zbyt wiele odpowiedzialności (za dużo robią). Tego nie załatwia się komentarzem tylko sugestywną nazwą funkcji.
3. Znany jest algorytm wygrywający dla tej gry. Skąd pomysł na "random"? Jeśli nawet random, to może warto losować spośród pól pustych a nie "próbować wylosować i jeśli puste to ok".
4. Zainteresuj się nagłówkiem <random> aby lepiej obsłużyć losowość.
5. Jeśli pojawiają Ci się struktury typu współrzędne pola, powinien to być oddzielny typ danych a nie "magiczne wartości 0,1,2" podawane w metodach.
6. Łamana jest reguła DRY (ang. Don't Repeat Yourself). Powtarzają Ci się ciała metod ze zmianą jednego parametru (np. Mode). To powinna być 1 metoda z parametrem.
7. Nie lepiej wywołać metody w rodzaju: bool chceckDiagonal(FieldType), bool checkColumn(FieldType), bool checkRow(FieldType) zwracające wynik testu czy w danym wierszu/kolumnie/przekątnej są takie same elementy?
8. Qt posiada wywołanie child*() zwracające listę widgetów umieszczonych w danym rodzicu. Ułatwi to iterowanie po elementach (teraz to "wklepujesz na piechotę").
Ogólna rada, spróbuj napisać tę grę na dowolnej wielkości planszy. Np. 4x4 tak aby zmiana wielkości wykonana była w 1 miejscu. To wymusi lepszą strukturę projektu.