Qtextedit - изменение размера

У меня есть QTextEdit, которые действуют как "дисплей" (редактируются как ложные). Текст, который он отображает, переносится на Word. Теперь я хочу установить высоту этого текстового поля так, чтобы текст в точности соответствовал (хотя и учитывал максимальную высоту).

В основном виджет (в том же вертикальном макете) под макетом должен иметь как можно больше места.

Как это можно достичь наиболее легко?

Ответ 1

Я нашел довольно стабильное и простое решение, используя 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 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_()

(Простите меня, я знаю, что ваш вопрос о С++, и я использую Python, но в Qt они все равно одно и то же).

Ответ 2

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

Ответ 3

Текущий размер базового текста может быть доступен через

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();    
}

Ответ 4

Говоря о Python, я действительно нашел .setFixedWidth( your_width_integer ) и .setFixedSize( your_width, your_height ) весьма полезным. Не уверен, что C имеет похожие атрибуты виджета.

Ответ 5

В моем случае я поставил QLabel внутри QScrollArea. И если вы увлечены, вы объединяете оба и создаете свой собственный виджет.