qtextedit - изменить размер, чтобы соответствовать
У меня есть QTextEdit, который действует как "displayer" (редактируемый в false). Текст, который он отображает, завернут в слово. Теперь я хочу установить высоту этого текстового поля так, чтобы текст точно подходил (при этом также учитывалась максимальная высота).
В основном виджет (в том же вертикальном макете) под макетом должен занимать как можно больше места.
Как это может быть достигнуто наиболее легко?
5 ответов
Я нашел довольно стабильное, простое решение, используя QFontMetrics
!
from PyQt4 import QtGui
text = ("The answer is QFontMetrics\n."
"\n"
"The layout system messes with the width that QTextEdit thinks it\n"
"needs to be. Instead, let's ignore the GUI entirely by using\n"
"QFontMetrics. This can tell us the size of our text\n"
"given a certain font, regardless of the GUI it which that text will be displayed.")
app = QtGui.QApplication([])
textEdit = QtGui.QPlainTextEdit()
textEdit.setPlainText(text)
textEdit.setLineWrapMode(True) # not necessary, but proves the example
font = textEdit.document().defaultFont() # or another font if you change it
fontMetrics = QtGui.QFontMetrics(font) # a QFontMetrics based on our font
textSize = fontMetrics.size(0, text)
textWidth = textSize.width() + 30 # constant may need to be tweaked
textHeight = textSize.height() + 30 # constant may need to be tweaked
textEdit.setMinimumSize(textWidth, textHeight) # good if you want to insert this into a layout
textEdit.resize(textWidth, textHeight) # good if you want this to be standalone
textEdit.show()
app.exec_()
(Простите, я знаю, что ваш вопрос о C++, и я использую Python, но в Qt
они все равно одно и то же).
Если нет ничего особенного в возможностях QTextEdit
что вам нужно, QLabel
с включенным переносом слов будет делать то, что вы хотите.
Текущий размер основного текста может быть доступен через
QTextEdit::document()->size();
и я считаю, что с помощью этого мы могли бы соответственно изменить размер виджета.
#include <QTextEdit>
#include <QApplication>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTextEdit te ("blah blah blah blah blah blah blah blah blah blah blah blah");
te.show();
cout << te.document()->size().height() << endl;
cout << te.document()->size().width() << endl;
cout << te.size().height() << endl;
cout << te.size().width() << endl;
// and you can resize then how do you like, e.g. :
te.resize(te.document()->size().width(),
te.document()->size().height() + 10);
return a.exec();
}
В моем случае я поместил свой QLabel в QScrollArea. И если вы увлечены, вы комбинируете оба и создаете свой собственный виджет.
Говоря о Python, я на самом деле нашел .setFixedWidth( your_width_integer )
а также .setFixedSize( your_width, your_height )
довольно полезно. Не уверен, что C имеет похожие атрибуты виджета.