У верхнего фрейма поставить вертикальную sizePolicy Expanding, у нижнего text edit'a - Maximum. При изменении текста по сигналу менять maximumHeight у text edit'a. Я на коленке за 5 минут сделал что-то типа того:
const int maximumTextAreaHeight = 100;
int recountTextAreaHeight(const QString& text)
{
    int linesCount = text.count('\n');
    return /* высота текста */         9 * (linesCount + 1) + 
            /* межстрочный интервал */ 4 * linesCount + 
            /* 2х поля textEdit'a */   10;
}
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->frame->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    ui->textEdit->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
    on_textEdit_textChanged();
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_textEdit_textChanged()
{
    int countedHeight = recountTextAreaHeight(ui->textEdit->toPlainText());
    ui->textEdit->setMaximumHeight(countedHeight > maximumTextAreaHeight ? maximumTextAreaHeight : countedHeight);
    ui->textEdit->setVerticalScrollBarPolicy(countedHeight > maximumTextAreaHeight ? Qt::ScrollBarAsNeeded : Qt::ScrollBarAlwaysOff);
}
Самое сложное: написать правильно функцию recountTextAreaHeight. Мне щас лень ее по уму писать, я написал так, чтобы работало на стандартном font'е в винде. По хорошему в ней нужно использовать QFontMetrics, а также где-то взять значения margins text edit'a (возможно, вбить константными).