У верхнего фрейма поставить вертикальную 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 (возможно, вбить константными).