Russian Qt Forum
Апрель 26, 2024, 14:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Резиновый TextEdit  (Прочитано 2759 раз)
joffadark
Гость
« : Июнь 20, 2015, 00:16 »

Здравствуйте, уважаемые форумчане.

Необходимо реализовать необычный flex-интерфейс. Есть QFrame, внутри которого два QFrame. Внешний фрэйм компонует их по вертикали.

В верхнем фрэйме располагается виджет, который занимает все пространство фрэйма.

В нижнем фрэйме зона ввода данных: есть QTextEdit. У него должна быть задана минимальная высота и максимальная высота.
Изначально, нижний фрэйм должен иметь минимальную высоту.
По мере наполнения QTextEdit (по высоте, несколько строк), нижний фрэйм должен увеличиваться по высоте и уменьшать высоту верхнего врэйма. Иными словами, QTextEdit при переносе строк должен увеличивать свое занимаемое пространство по высоте.
И так до максимальной высоты, а дальше появляется скроллбар.

По умолчанию, QTextEdit при выходе за границы высоты просто отображает скроллбар.

Подскажите пожалуйста: как реализовать подобное?

Записан
sociopath
Гость
« Ответ #1 : Июнь 20, 2015, 02:14 »

У верхнего фрейма поставить вертикальную 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 (возможно, вбить константными).
Записан
joffadark
Гость
« Ответ #2 : Июнь 24, 2015, 05:18 »

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

Огромнейшее тебе спасибо!
Записан
Doggike
Гость
« Ответ #3 : Июль 13, 2015, 07:26 »

I feel good to have people give vent to the back.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 20.