Q: invalid use of incomlete type 'ui:***' Нужно сделать базовый класс BaseWidget, который содержит в себе базовый ui и наследоваться от него другими классами, которые будут использовать его ui и, вероятно, дополнять.
Во имя инкапсуляции решил сделать методы для получения указателя на ui.
При использовании его внутри класса BaseWidget проблем не возникает, но при попытке доступа через геттер получаю следующую ошибку:
*/mainwidget.cpp: In constructor 'MainWidget::MainWidget(QSqlTableModel*, QWidget*)':
*/mainwidget.cpp:15:17: error: invalid use of incomplete type 'class Ui::BaseTableWidget'
     connect(ui()->addButton,      &QPushButton::clicked,
                 ^
In file included from */mainwidget.h:5:0,
                 from */mainwidget.cpp:1:
*/basetablewidget.h:12:7: note: forward declaration of 'class Ui::BaseTableWidget'
 class BaseTableWidget;  


// mainwidget.cpp
MainWidget::MainWidget(QSqlTableModel* m, QWidget *parent) :
    BaseTableWidget(m, headers, parent)
{    
    connect(ui()->addButton,      &QPushButton::clicked,
            this, &MainWidget::addClient);
    ***
}


// basewidget.h
namespace Ui {
class BaseTableWidget;
}

class BaseTableWidget : public QWidget
{
    Q_OBJECT

public:
    explicit BaseTableWidget(QSqlTableModel *model, const QStringList& headers,
                             QWidget *parent = 0);
    virtual ~BaseTableWidget();

    Ui::BaseTableWidget*    ui()                { return _ui; }

    ***

private:
    Ui::BaseTableWidget*    _ui;

    ***
}


#include "basetablewidget.h"
#include "ui_basetablewidget.h"

BaseTableWidget::BaseTableWidget(QSqlTableModel* m, const QStringList &headers,
                                 QWidget *parent) :
    QWidget(parent),
    _ui(new Ui::BaseTableWidget)
{
    _ui->setupUi(this);

    ***

}


A: Везде где вы используете ui нужно подключать #include "ui_basetablewidget.h". Так как именно там находится его полное объявление. В basewidget.h находится только forward declaration:
namespace Ui {
class BaseTableWidget;
} 

Однако я бы все же посоветовал вам не обращаться к виджетам напрямую через ui. Если вы решите изменить внешний вид BaseTableWidget или отказаться от _ui, то вам придется вносить изменения во всей программе. По сути вы только создаете видимость инкапсуляции, теряя все ее преимущества. Лучше будет сделать методы, которые будут манипулировать _ui:
class MainWindow : public QMainWindow{
public:  
    void setAge(int age){
        _ui->ageInput->setValue(age);
    }
    int age() const{
        return _ui->ageInput->value();
    }
    void setName(const QString &name){
        _ui->nameInput->setText(name);
    }
    QString name() const{
        _ui->nameInput->text();
    }
private:
    Ui::MainWindow *_ui;
};

