我需要的文本將包含以下樣式來顯示簡單的狀態行:我可以使用簡單的HTML單行大小的QTextEdit嗎?
- 顏色
- 大膽
- 斜體
QTextEdit
可以使簡單的HTML。但它也強行擴展到多行:加入
紅色的背景強調QTextEdit
的尺寸。所需的大小是一個文本行的大小。我如何實現這一目標?
我需要的文本將包含以下樣式來顯示簡單的狀態行:我可以使用簡單的HTML單行大小的QTextEdit嗎?
QTextEdit
可以使簡單的HTML。但它也強行擴展到多行:加入
紅色的背景強調QTextEdit
的尺寸。所需的大小是一個文本行的大小。我如何實現這一目標?
首先,如果你只是使用了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()
足夠大以適應文本文檔。小部件本身可能會更大,具體取決於活動樣式或樣式表。
下面是一個如何實現這個的例子。行編輯的內容會傳播到只讀message
QTextEdit
,以便您可以注意如何實時更新小部件大小,因爲文本太長而無法放入一行。這會在您更改小部件的寬度時自動處理更新大小,因爲文檔大小也會因高度與寬度的折衷而發生變化。
// 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();
}
如果你想有一個文本行的大小,使用QFontMetrics:
QTextEdit* textEdit = new QTextEdit();
QFontMetrics metrics(textEdit->font());
int lineHeight = metrics.lineSpacing();
textEdit->setFixedHeight(lineHeight);
您可以添加一個或兩個像素lineHeight
,如果它是不夠的。
猜測在小部件的大小說'你可能會添加一個或兩個像素'是錯誤的:( –
這段代碼就夠了,這只是如果最終的可視化渲染不方便的OP – IAmInPLS
你假設一個整體這是不夠的,'QTextEdit'使用特定的佈局呈現'QTextDocument','QTextEdit :: font'與用於顯示文本的字體或字體沒有任何關係。 。你試圖錯誤地重新發明輪子,你不能認爲一個富文本佈局會在底層部件的字體給定的高度渲染。 –
也許簡單的解決方法是使用setFixedHeight
方法QWidget
類(Qt文檔:http://doc.qt.io/qt-5/qwidget.html#setFixedHeight)
yourTextEdit->setFixedHeight(/*Height for one text line*/);
但我怎麼知道一條線的像素高度? –
當然,你可以使用QFontMetrics。 @IAmInPLS是正確的。我認爲這是最好的方式。另一種方式 - 實際確定所需的身高,當你開始申請時。但是,如果您只有一個QFont併爲您的樣式QTextEdit,這可能會很有用。還有一種方法 - 可能使用QLabel。 –
是的,QLabel也呈現HTML,所以它似乎是一個很好的選擇 – IAmInPLS
QTextEdit* te = new QTextEdit ("0");
te->setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOn);
te->setVerticalScrollBarPolicy (Wt::ScrollBarAlwaysOff);
te->setLineWrapMode (QTextEdit::NoWrap);
te->setFixedHeight (50);
該取得的差是NoWrap
線。
爲什麼在構造函數中使用花括號? –
@TomášZato爲什麼不呢?構造和函數/方法調用實際上是兩種不同的動物,在C++ 98中都使用共享的過載語法。我很感謝C++ 11中的統一初始化最終消除了它們的歧義。 –