Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: yarick от Октябрь 03, 2012, 21:52



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

через
Код:
QFontMetrics m (font()) ;
int RowHeight =m.lineSpacing()
не годится, т.к. там не точно возвращается значение. Да и к тому же я не могу узнать количество строк точно - ведь возможны переносы...


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: V1KT0P от Октябрь 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().
Как говорится выбирай на любой вкус.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Alex Custov от Октябрь 03, 2012, 23:08
Код
C++ (Qt)
   int height = QFontMetrics(font()).boundingRect(QRect(), alignment, text).height();


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Lucky_spirit от Октябрь 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();
}
 


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: navrocky от Октябрь 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()


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Lucky_spirit от Октябрь 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? Мне кажется, от него наследование было бы более логичным. Но, в любом случае, спасибо за ответ! Сейчас буду дальше копать.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: navrocky от Октябрь 04, 2012, 08:34
Не углядел что QTextBrowser, значит наследуйтесь от QTextBrowser...

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

Ну да.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Lucky_spirit от Октябрь 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.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: GreatSnake от Октябрь 05, 2012, 11:10
Нужно ещё перегрузить minimumSizeHint().


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Lucky_spirit от Октябрь 05, 2012, 11:31
Нужно ещё перегрузить minimumSizeHint().
Вроде бы как в документации указано, что при нулевых значениях размер виджета устанавливается в какой-то определенный размер.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: GreatSnake от Октябрь 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.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Lucky_spirit от Октябрь 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). В чём может быть причина?


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Lucky_spirit от Октябрь 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(), то будет второй скрин.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: GreatSnake от Октябрь 15, 2012, 10:31
Какой QSizePolicy используется для QTextBrowser и какой QLayout::SizeConstraint для QLayout?
Не мешало бы увидеть работающий код.


Название: Re: Высота QTextEdit в соответствии с тектом
Отправлено: Lucky_spirit от Октябрь 15, 2012, 13:09
Какой QSizePolicy используется для QTextBrowser и какой QLayout::SizeConstraint для QLayout?
Не мешало бы увидеть работающий код.
Вот ссылка на git репозиторий: https://github.com/Lucky-spirit/Financial-analysis.git (https://github.com/Lucky-spirit/Financial-analysis.git) . Этот код, не изменяя в нем ни строчки, ведет себя совершенно по-разному в Linux, Windows и Mac OS X.