2016-06-21 81 views

回答

2

首先,如果你只是使用了QLabel,你不需要做什麼特別的事情:它支持豐富的文本格式,只需根據需要儘可能多的空間:如果你堅持使用QTextEdit

#include <QtWidgets> 
int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QWidget w; 
    QVBoxLayout layout{&w}; 
    QLineEdit edit; 
    QLabel message{"Foo <font color=\"red\">Bar!</font>"}; 
    message.setTextFormat(Qt::RichText); 
    message.setWordWrap(true); 
    message.setFrameStyle(QFrame::Box); 
    layout.addWidget(&edit); 
    layout.addWidget(&message); 
    layout.addStretch(); 
    QObject::connect(&edit, &QLineEdit::textChanged, &message, &QLabel::setText); 
    w.show(); 
    return app.exec(); 
} 

:它包含了QTextDocument,其佈局。每次尺寸改變時,佈局都會發出一個信號。您可以根據該信號來更改窗口小部件的高度以適應文檔的大小。考慮到QTextEdit的結構:它是QAbstractScrollArea,其內容顯示在viewport()小部件中。目標是讓viewport()足夠大以適應文本文檔。小部件本身可能會更大,具體取決於活動樣式或樣式表。

下面是一個如何實現這個的例子。行編輯的內容會傳播到只讀messageQTextEdit,以便您可以注意如何實時更新小部件大小,因爲文本太長而無法放入一行。這會在您更改小部件的寬度時自動處理更新大小,因爲文檔大小也會因高度與寬度的折衷而發生變化。

// https://github.com/KubaO/stackoverflown/tree/master/questions/textedit-height-37945130 
#include <QtWidgets> 

void updateSize(QTextEdit * edit) { 
    auto textHeight = edit->document()->documentLayout()->documentSize().height(); 
    edit->setFixedHeight(textHeight + edit->height() - edit->viewport()->height()); 
} 

int main(int argc, char ** argv) { 
    QApplication app{argc, argv}; 
    QWidget w; 
    QVBoxLayout layout{&w}; 
    QLineEdit edit; 
    QTextEdit message; 
    message.setReadOnly(true); 
    message.setText("Foo Bar!"); 
    layout.addWidget(&edit); 
    layout.addWidget(&message); 
    layout.addStretch(); 
    QObject::connect(&edit, &QLineEdit::textChanged, &message, &QTextEdit::setPlainText); 
    QObject::connect(message.document()->documentLayout(), 
        &QAbstractTextDocumentLayout::documentSizeChanged, 
        &message, [&]{ updateSize(&message); }); 
    w.show(); 
    return app.exec(); 
} 
+0

爲什麼在構造函數中使用花括號? –

+0

@TomášZato爲什麼不呢?構造和函數/方法調用實際上是兩種不同的動物,在C++ 98中都使用共享的過載語法。我很感謝C++ 11中的統一初始化最終消除了它們的歧義。 –

2

如果你想有一個文本行的大小,使用QFontMetrics

QTextEdit* textEdit = new QTextEdit(); 
QFontMetrics metrics(textEdit->font()); 
int lineHeight = metrics.lineSpacing(); 
textEdit->setFixedHeight(lineHeight); 

您可以添加一個或兩個像素lineHeight,如果它是不夠的。

+0

猜測在小部件的大小說'你可能會添加一個或兩個像素'是錯誤的:( –

+0

這段代碼就夠了,這只是如果最終的可視化渲染不方便的OP – IAmInPLS

+0

你假設一個整體這是不夠的,'QTextEdit'使用特定的佈局呈現'QTextDocument','QTextEdit :: font'與用於顯示文本的字體或字體沒有任何關係。 。你試圖錯誤地重新發明輪子,你不能認爲一個富文本佈局會在底層部件的字體給定的高度渲染。 –

2

也許簡單的解決方法是使用setFixedHeight方法QWidget類(Qt文檔:http://doc.qt.io/qt-5/qwidget.html#setFixedHeight

yourTextEdit->setFixedHeight(/*Height for one text line*/); 
+0

但我怎麼知道一條線的像素高度? –

+1

當然,你可以使用QFontMetrics。 @IAmInPLS是正確的。我認爲這是最好的方式。另一種方式 - 實際確定所需的身高,當你開始申請時。但是,如果您只有一個QFont併爲您的樣式QTextEdit,這可能會很有用。還有一種方法 - 可能使用QLabel。 –

+0

是的,QLabel也呈現HTML,所以它似乎是一個很好的選擇 – IAmInPLS

0
QTextEdit* te = new QTextEdit ("0"); 
te->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOn); 
te->setVerticalScrollBarPolicy (Wt::ScrollBarAlwaysOff); 
te->setLineWrapMode (QTextEdit::NoWrap); 
te->setFixedHeight (50); 

該取得的差是NoWrap線。

相關問題