我正在开发一个Qt应用程序,我正在尝试找到一种方法来使用QTextEdit作为带有长文本而没有滚动条的
label
。在我的用户界面中,我有一个 QScrollArea
,在其中我想放置几个 QTextEdit
小部件,并且我只想在 QScrollArea
内使用滚动。问题是,无论我如何尝试调整 QTextEdit
的大小,它似乎都有最大高度和文本剪切,即使我手动设置大小并且 QTextEdit::size
返回正确的值。
我对
QLabel
做了同样的事情,它工作得很好,但在这种情况下,我需要一些仅在 QTextEdit
中提供的方法。
我找到了这篇文章: 调整 QT 的 QTextEdit 大小以匹配文本高度:maximumViewportSize()
给出的答案如下:
我已经解决了这个问题。我必须做两件事才能得到 它可以工作:
- 向上查看小部件层次结构并确保制定所有尺寸策略 确保如果任何子部件想要变大/变小,那么 父小部件希望是相同的东西。
- 这是主要的 修复的来源。事实证明,由于 QTextEdit 位于 QFrame 是 QScrollArea 中的主要小部件,QScrollArea 有一个 约束它不会调整内部小部件的大小,除非 “widgetRessized”属性为 true。其文档是 这里:http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop。 在我尝试这个之前,文档对我来说并不清楚 设置并让它工作。从文档来看,这个属性似乎 仅处理主滚动区域想要调整大小的时间 小部件(即从父级到子级)。这实际上意味着如果主要 滚动区域中的小部件想要调整大小(即子级到父级), 那么这个设置必须设置为true。所以,这个故事的寓意是 QTextEdit 代码在覆盖 sizeHint 方面是正确的,但是 QScrollArea 忽略了从主框架返回的值 尺寸提示。
问题是我不知道如何访问
QTextEdit's
QScrollArea
来启用 widgetResizable
。任何人都可以解释我如何实现这一目标,或者建议一种不同的调整大小的方式来完美地适应其内容?QTextEdit
connect( m_textField, SIGNAL( textChanged() ), this, SLOT( onTextChanged() ) );
void MyClass::onTextChanged()
{
QSize size = m_textField->document()->size().toSize();
m_textField->setFixedHeight( size.height() + 3 );
}
QTextEdit textEdit;
textEdit.setHtml("<p>test test test test test test</p><p>|||||||||</p>");
textEdit.show();
textEdit.setFixedWidth(textEdit.document()->idealWidth() +
textEdit.contentsMargins().left() +
textEdit.contentsMargins().right());
,其
sizeHint取决于当前文档大小。
QTextEdit
然后用作...
class text_edit: public QTextEdit {
using super = QTextEdit;
public:
explicit text_edit (QWidget *parent = nullptr)
: super(parent)
{
setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
virtual QSize sizeHint () const override
{
QSize s(document()->size().toSize());
/*
* Make sure width and height have `usable' values.
*/
s.rwidth() = std::max(100, s.width());
s.rheight() = std::max(100, s.height());
return(s);
}
protected:
virtual void resizeEvent (QResizeEvent *event) override
{
/*
* If the widget has been resized then the size hint will
* also have changed. Call updateGeometry to make sure
* any layouts are notified of the change.
*/
updateGeometry();
super::resizeEvent(event);
}
};
在我所做的一些测试中,它似乎
按预期工作。
QScrollArea sa;
sa.setWidgetResizable(true);
text_edit te;
te.setPlainText(...);
sa.setWidget(&te);
sa.show();
中我定义了
ui
对象。我将其写为 QTextEdit *textEdit
可扩展内容:height
注意:如果您更改
int count = 0;
QString str = "";
// set textEdit text
ui->textEdit->setText("hfdsf\ncsad\nfsc\dajkjkjkjhhkdkca\n925");
str = ui->textEdit->toPlainText();
for(int i = 0;i < str.length();i++)
if(str.at(i).cell() == '\n')
count++;
// resize textEdit (width and height)
ui->textEdit->resize(ui->textEdit->fontMetrics().width("this is the max-length line in qlabel")
, ui->textEdit->fontMetrics().height() * (count + 2));
字体或大小,此功能即可工作!只是高度可缩放(在每件事之前将您的
QTextEdit
框架形状设置为QTextEdit
)。如果您想要宽度可缩放内容,您应该执行以下步骤:
将
BOX
QTextEdit
对象)文本逐行读取计算每条线的长度textEdit
QTextEdit::fontMetrics().width(QString str)
宽度尺寸
str
其中“field”是添加到托管 QFrame“frame”布局中的 QTextEdit。