我可以使用简单的 html 使用单行大小的 QTextEdit 吗?

Tom*_*ica 2 qt qt-designer qtextedit

我需要显示包含以下样式的文本的简单状态行:

  • 颜色
  • 胆大
  • 斜体

QTextEdit可以渲染简单的 HTML。但它也强行扩展到多行:

图片说明

添加了红色背景以强调QTextEdit. 所需大小是一行文本的大小。我如何做到这一点?

Rei*_*ica 5

首先,如果您只是使用 a 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();
}
Run Code Online (Sandbox Code Playgroud)

如果你坚持使用 a QTextEdit: 它包含一个QTextDocument,由它的documentLayout(). 每次其大小发生变化时,布局都会发出一个信号。您可以根据该信号来更改小部件的高度以适应文档的大小。考虑到 a 的结构QTextEdit:它是 aQAbstractScrollArea并且内容显示在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();
}
Run Code Online (Sandbox Code Playgroud)