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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Высота QTextEdit в соответствии с тектом  (Прочитано 10670 раз)
yarick
Гость
« : Октябрь 03, 2012, 21:52 »

Я хочу выводить мой текст как серию из абзацев, каждый из которых представлен QTextEdit (не спрашивайте почему).
Как мне узнать фактическую высоту текста, чтобы потом с помощью setFixedHeight установить высоту абзаца. Тогда за ним будет по порядку следовать другой и текст будет выглядеть как будто это один компонент.

через
Код:
QFontMetrics m (font()) ;
int RowHeight =m.lineSpacing()
не годится, т.к. там не точно возвращается значение. Да и к тому же я не могу узнать количество строк точно - ведь возможны переносы...
Записан
V1KT0P
Гость
« Ответ #1 : Октябрь 03, 2012, 22:06 »

Код
C++ (Qt)
QFontMetrics::height
Возвращает максимальную высоту текста для текущего шрифта.
Вот описание:
Код
C++ (Qt)
int QFontMetrics::height () const
Returns the height of the font.
This is always equal to ascent()+descent()+1 (the 1 is for the base line).
See also leading() and lineSpacing().
А вот то что ты используешь:
Код
C++ (Qt)
int QFontMetrics::lineSpacing () const
Returns the distance from one base line to the next.
This value is always equal to leading()+height().
See also height() and leading().
И
Код
C++ (Qt)
int QFontMetrics::leading () const
Returns the leading of the font.
This is the natural inter-line spacing.
See also height() and lineSpacing().
Как говорится выбирай на любой вкус.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Октябрь 03, 2012, 23:08 »

Код
C++ (Qt)
   int height = QFontMetrics(font()).boundingRect(QRect(), alignment, text).height();
Записан
Lucky_spirit
Гость
« Ответ #3 : Октябрь 04, 2012, 02:50 »

Народ, доброго времени суток!
Дабы не плодить еще одну тему, задам очень и очень похожий вопрос. У меня есть QTextBrowser. В нем отображается содержимое html файла. Сам файл грамотно прописан в файле ресурсов. С выводом самого текста проблем нет. Проблема заключается в том, что как бы ни был мал текст или вообще QTextBrowser был пустой, его высота превышает необходимое значение. Пытался добавить распорку над этим QTextBrowser, но она почти не спасает ситуацию Подскажите, что делать? Вот код и ниже скрин. В идеале хотелось бы, что бы QTextBrowser поджимался до необходимого минимального размера по вертикали.
Код
C++ (Qt)
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QTextBrowser>
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
 
   QWidget *pWidget = new QWidget;
 
   QTextBrowser *pText = new QTextBrowser;
   pText->setSource(QUrl("qrc:/all/files/index.html"));
   pText->adjustSize();
 
   QVBoxLayout *pLayoutVertical = new QVBoxLayout;
   pLayoutVertical->addStretch(1);
   pLayoutVertical->addWidget(pText, 0);
 
   pWidget->setLayout(pLayoutVertical);
   pWidget->showMaximized();
 
   return app.exec();
}
 
« Последнее редактирование: Октябрь 04, 2012, 02:51 от Lucky_spirit » Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Октябрь 04, 2012, 08:23 »

Надо отнаследоваться от QTextEdit, переписать sizeHint. Размер текста по высоте можно получить с помощью QTextDocument::size().
Код
C++ (Qt)
QSize MyTextEdit::sizeHint() const
{
   QMargins m(contentsMargins());
   return document()->size() + QSize(m.left() + m.right(), m.top() + m.bottom());
}
 

Чтобы при изменении текста размер автоматически подстраивался, надо по сигналу QTextDocument::contentsChanged() звать QWidget::updateGeometry()
Записан

Гугль в помощь
Lucky_spirit
Гость
« Ответ #5 : Октябрь 04, 2012, 08:32 »

Надо отнаследоваться от QTextEdit, переписать sizeHint. Размер текста по высоте можно получить с помощью QTextDocument::size().
Код
C++ (Qt)
QSize MyTextEdit::sizeHint() const
{
   QMargins m(contentsMargins());
   return document()->size() + QSize(m.left() + m.right(), m.top() + m.bottom());
}
 

Чтобы при изменении текста размер автоматически подстраивался, надо по сигналу QTextDocument::contentsChanged() звать QWidget::updateGeometry()

Немного не понял, что такое за слово "отнаследоваться"? В смысле, написать свой производный класс, базовым для которого будет QTextEdit? А почему не QTextBrowser? Мне кажется, от него наследование было бы более логичным. Но, в любом случае, спасибо за ответ! Сейчас буду дальше копать.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #6 : Октябрь 04, 2012, 08:34 »

Не углядел что QTextBrowser, значит наследуйтесь от QTextBrowser...

Цитировать
Немного не понял, что такое за слово "отнаследоваться"? В смысле, написать свой производный класс, базовым для которого будет XXX?

Ну да.
Записан

Гугль в помощь
Lucky_spirit
Гость
« Ответ #7 : Октябрь 04, 2012, 22:38 »

Надо отнаследоваться от QTextEdit, переписать sizeHint. Размер текста по высоте можно получить с помощью QTextDocument::size().
Код
C++ (Qt)
QSize MyTextEdit::sizeHint() const
{
   QMargins m(contentsMargins());
   return document()->size() + QSize(m.left() + m.right(), m.top() + m.bottom());
}
 

Там небольшая ошибка была. Добавил еще перевод из QSizeF в обычный QSize. Но все равно текстовое поле не становится меньше, чем 4 строки. Но уже все равно намного лучше! Вот мой весь код.
Код
C++ (Qt)
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QTextBrowser>
#include <iostream>
 
class evgTextBrowser : public QTextBrowser
{
public:
   explicit evgTextBrowser(QWidget *parent = 0) : QTextBrowser(parent) {}
 
   QSize sizeHint() const {
       QMargins m(contentsMargins());
       return document()->size().toSize() + QSize(m.left() + m.right(), m.top() + m.bottom());
   }
};
 
int main(int argc, char **argv)
{
   QApplication app(argc, argv);
 
   QWidget *pWidget = new QWidget;
 
   evgTextBrowser *pText = new evgTextBrowser;
   pText->setSource(QUrl("qrc:/all/files/index.html"));
   pText->adjustSize();
 
 
   QVBoxLayout *pLayoutVertical = new QVBoxLayout;
   pLayoutVertical->addStretch(1);
   pLayoutVertical->addWidget(pText, 0);
 
   pWidget->setLayout(pLayoutVertical);
   pWidget->showMaximized();
 
   return app.exec();
}
 

Ошибка заключается в том, что вилжет всё равно не меньше 4-х строчек показывает, даже если текста всего 2 строки или 1.
« Последнее редактирование: Октябрь 04, 2012, 23:15 от Lucky_spirit » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Октябрь 05, 2012, 11:10 »

Нужно ещё перегрузить minimumSizeHint().
Записан

Qt 5.11/4.8.7 (X11/Win)
Lucky_spirit
Гость
« Ответ #9 : Октябрь 05, 2012, 11:31 »

Нужно ещё перегрузить minimumSizeHint().
Вроде бы как в документации указано, что при нулевых значениях размер виджета устанавливается в какой-то определенный размер.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Октябрь 05, 2012, 11:38 »

Цитата: assistant
QLayout will never resize a widget to a size smaller than the minimum size hint unless minimumSize() is set or the size policy is set to QSizePolicy::Ignore. If minimumSize() is set, the minimum size hint will be ignored.
Записан

Qt 5.11/4.8.7 (X11/Win)
Lucky_spirit
Гость
« Ответ #11 : Октябрь 10, 2012, 23:21 »

Ребята, опять я где-то чего-то не дочитал. В общем, в Windows наблюдаю такую картину. Переопределен метод sizeHint() в собственном классе. Размер подбирается более-менее нормально, но размер окошка с пустым текстом - как уже описывал выше. Переопределил по совету выше и метод minimumSizeHint(). Теперь окошко с текстом отображается высотой не более 1 мм. То есть текста там вообще не видно. Копал дебаггером. Оказалось, что в строке
Код
C++ (Qt)
return document()->size() + QSize(m.left() + m.right(), m.top() + m.bottom());
размер документа возвращает равный QSize(0, 0). В чём может быть причина?
Записан
Lucky_spirit
Гость
« Ответ #12 : Октябрь 15, 2012, 08:47 »

Всем доброго времени суток! Как не игрался я с высотой, ничего хорошего получить не смог. В Windows и Linux совершенно разно ведет себя окно. С Linux скриншот немного позже выложу вот код и скриншот с Windows.
Заголовочный файл:
Код
C++ (Qt)
#ifndef EVGTEXTBROWSER_H
#define EVGTEXTBROWSER_H
 
#include <QTextBrowser>
 
class evgTextBrowser : public QTextBrowser
{
   Q_OBJECT
public:
   explicit evgTextBrowser(QWidget *parent = 0);
 
   QSize sizeHint() const;
   QSize minimumSizeHint() const;
 
 
signals:
 
public slots:
 
};
 
#endif // EVGTEXTBROWSER_H
 
Файл исходного текста:
Код
C++ (Qt)
#include "evgtextbrowser.h"
 
evgTextBrowser::evgTextBrowser(QWidget *parent) :
   QTextBrowser(parent)
{
}
 
QSize evgTextBrowser::sizeHint() const
{
   if (document()->isEmpty())
       return QSize(0, 0);
   else
   {
       QMargins m(contentsMargins());
       return document()->size().toSize() + QSize(m.left() + m.right(), m.top() + m.bottom());
   }
}
 
QSize evgTextBrowser::minimumSizeHint() const
{
   if (document()->isEmpty())
       return QSize(0, 0);
   else
       return document()->size().toSize();
}
 
Скриншот прикреплен. Тонкая полоска внизу окна и есть тот самый evgTextBrowser. Если закомментировать мою реализацию методов sizeHint() и minimumSizeHint(), то будет второй скрин.
« Последнее редактирование: Октябрь 15, 2012, 08:51 от Lucky_spirit » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Октябрь 15, 2012, 10:31 »

Какой QSizePolicy используется для QTextBrowser и какой QLayout::SizeConstraint для QLayout?
Не мешало бы увидеть работающий код.
Записан

Qt 5.11/4.8.7 (X11/Win)
Lucky_spirit
Гость
« Ответ #14 : Октябрь 15, 2012, 13:09 »

Какой QSizePolicy используется для QTextBrowser и какой QLayout::SizeConstraint для QLayout?
Не мешало бы увидеть работающий код.
Вот ссылка на git репозиторий: https://github.com/Lucky-spirit/Financial-analysis.git . Этот код, не изменяя в нем ни строчки, ведет себя совершенно по-разному в Linux, Windows и Mac OS X.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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