我需要显示带有文本的简单状态行,其中包含以下样式:
QTextEdit
可以呈现简单的HTML。但它也强行扩展多行:
添加了红色背景以强调QTextEdit
的尺寸。所需大小是一个文本行的大小。我如何实现这一目标?
首先,如果您只是使用了QLabel
,则不需要做任何特殊的事情:它支持富文本格式,并且只需要占用尽可能多的空间:
#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();
}
如果你坚持使用QTextEdit
:它包含QTextDocument
,由其documentLayout()
布局。每次布局大小改变时,布局都会发出信号。您可以对该信号进行操作以更改窗口小部件的高度以适应文档的大小。考虑到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
添加一个或两个像素。
也许简单的解决方案是使用setFixedHeight
类的QWidget
方法(Qt文档:http://doc.qt.io/qt-5/qwidget.html#setFixedHeight)
yourTextEdit->setFixedHeight(/*Height for one text line*/);
您可以像这样创建和初始化文本框:
QTextEdit* te = new QTextEdit ("0");
te->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
te->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
te->setLineWrapMode(QTextEdit::NoWrap);
te->setFixedHeight(50);
关键属性是setLineWrapMode
,我已经设置为NoWrap
。