如何调整QTextEdit以适应其内容

问题描述 投票:0回答:5

我正在开发一个Qt应用程序,我正在尝试找到一种方法来使用QTextEdit作为带有长文本而没有滚动条的

label
。在我的用户界面中,我有一个
QScrollArea
,在其中我想放置几个
QTextEdit
小部件,并且我只想在
QScrollArea
内使用滚动。问题是,无论我如何尝试调整
QTextEdit
的大小,它似乎都有最大高度和文本剪切,即使我手动设置大小并且
QTextEdit::size
返回正确的值。

我对

QLabel
做了同样的事情,它工作得很好,但在这种情况下,我需要一些仅在
QTextEdit
中提供的方法。

我找到了这篇文章: 调整 QT 的 QTextEdit 大小以匹配文本高度:maximumViewportSize()

给出的答案如下:

我已经解决了这个问题。我必须做两件事才能得到 它可以工作:

  1. 向上查看小部件层次结构并确保制定所有尺寸策略 确保如果任何子部件想要变大/变小,那么 父小部件希望是相同的东西。
  2. 这是主要的 修复的来源。事实证明,由于 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
。任何人都可以解释我如何实现这一目标,或者建议一种不同的调整大小的方式来完美地适应其内容?
    

c++ qt resize qtextedit qscrollarea
5个回答
4
投票

QTextEdit



3
投票

connect( m_textField, SIGNAL( textChanged() ), this, SLOT( onTextChanged() ) ); void MyClass::onTextChanged() { QSize size = m_textField->document()->size().toSize(); m_textField->setFixedHeight( size.height() + 3 ); }



2
投票
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); } };

在我所做的一些测试中,它
似乎

按预期工作。


0
投票
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)
    宽度尺寸
    
    
    
  • 我希望这可以帮助你...


0
投票

str

其中“field”是添加到托管 QFrame“frame”布局中的 QTextEdit。

© www.soinside.com 2019 - 2024. All rights reserved.