如何调整QTextEdit以适应它的内容

时间:2017-12-08 08:24:44

标签: c++ qt resize qtextedit qscrollarea

我正在开发一个Qt应用程序,我正在尝试找到一种方法,将QTextEdit用作带有长文本的label,而不使用滚动条。在我的ui中我有一个QScrollArea并且在其中我想放置几个QTextEdit小部件,我只想在QScrollArea内使用滚动。问题是,无论我如何尝试调整QTextEdit的大小,它似乎都有最大高度和文本切割,即使我手动设置大小并且QTextEdit::size返回正确的值。

我使用QLabel做了同样的事情并且它工作正常,但在这种情况下我需要一些仅在QTextEdit中提供的方法。

我发现这篇文章: Resizing QT's QTextEdit to Match Text Height: maximumViewportSize()

答案如下:

  

我已经解决了这个问题。我有两件事要做   它起作用:

     
      
  1. 向上移动窗口小部件层次结构并确保制定所有大小的策略   感觉确保如果任何子小部件想要大/小,那么   父窗口小部件想要是同一件事。
  2.   
  3. 这是主要的   修复的来源。事实证明,因为QTextEdit在一个内部   QFrame是QScrollArea中的主要小部件,QScrollArea有一个   限制它不会调整内部小部件的大小,除非   “widgetResizable”属性为true。该文件是   在这里:http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop。   在我玩这个之前,我不清楚文档   设置并让它工作。从文档来看,似乎这个属性   仅处理主滚动区域要调整大小的时间   小部件(即从父级到子级)。它实际上意味着如果主要   滚动区域中的小部件想要调整大小(即子级到父级),   然后必须将此设置设置为true。所以,故事的寓意是   QTextEdit代码在覆盖sizeHint时是正确的,但是   QScrollArea忽略了主框架返回的值   sizeHint。
  4.   

问题在于我不知道如何访问QTextEdit's QScrollArea以启用widgetResizable。任何人都可以解释我是如何实现这一点或建议一种不同的方法来调整QTextEdit的大小以完全符合它的内容吗?

4 个答案:

答案 0 :(得分: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());

答案 1 :(得分:1)

如果没有具体的例子,很难判断,但......听起来好像只是想要一个QTextEdit sizeHint取决于当前的文件大小。

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();

答案 2 :(得分:0)

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 frameShape设置为BOX)。

如果你想做宽度可伸缩内容,你应该执行以下步骤:

  • QTextEdittextEdit对象)文字读作第
  • 计算每一行长度
  • 选择最大行长度
  • 使用QTextEdit::fontMetrics().width(QString str)调查str尺寸的宽度

我希望这可以帮助你...

答案 3 :(得分:0)

这将允许文本框的高度根据需要更改。您可以稍微编辑一下代码以处理宽度。

connect( m_textField, SIGNAL( textChanged() ), this, SLOT( onTextChanged() ) );

void MyClass::onTextChanged()
{
  QSize size = m_textField->document()->size().toSize();

  m_textField->setFixedHeight( size.height() + 3 );
}