如何调整QTextEdit以适应其内容

我正在开发一个Qt应用程序,我试图找到一种方法来使用QTextEdit作为一个带有长文本但没有滚动条的label 。 在我的用户界面中,我有一个QScrollArea ,在其中我想放置一对QTextEdit小部件,我只想在QScrollArea使用滚动。 问题是,无论我如何尝试调整QTextEdit大小,它似乎都具有最大高度和文本的裁剪,即使我手动设置大小并且QTextEdit::size返回正确的值。

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

我发现这篇文章:调整QT的QTextEdit以匹配文本高度:maximumViewportSize()

给出的答案如下:

我已经解决了这个问题。 有两件事我必须做才能让它起作用:

  • 走上小部件层次结构并确保所有大小策略都有意义,以确保如果有任何子小部件想要成为大/小,那么父小部件将希望成为相同的东西。
  • 这是修复的主要来源。 事实证明,由于QTextEdit位于QScrollArea中的主窗口小部件QFrame内部,因此QScrollArea有一个限制,即它不会调整内部窗口小部件的大小,除非“widgetResizable”属性为true。 该文档在这里:http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop。 直到我使用这个设置并使其正常工作之前,文档并不清楚。 从文档看来,这个属性似乎只处理主滚动区域想要调整窗口小部件(即从父窗口到子窗口)的时间。 它实际上意味着如果滚动区域中的主窗口小部件想要不断调整大小(即,从小孩到父母),则必须将此设置设置为true。 所以,故事的道理是QTextEdit代码在覆盖sizeHint时是正确的,但QScrollArea忽略了从主框架的sizeHint返回的值。
  • 问题是我不知道如何访问QTextEdit's QScrollArea来启用widgetResizable 。 任何人都可以解释我如何实现这一目标,或者提出一种调整QTextEdit以完全适合其内容的不同方式?


    没有一个具体的例子很难判断,但是......听起来好像你只是想要一个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();
    

    它在我所做的少数测试中似乎按预期工作。


    ui我定义了QTextEdit *textEdit对象。 我把它写成height可伸缩内容:

    int count = 0;
    QString str = "";
    
    // set textEdit text
    ui->textEdit->setText("hfdsfncsadnfscdajkjkjkjhhkdkcan925");
    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 )之前。

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

  • 阅读QTextEdit (文本textEdit对象)文本一行一行
  • 计算每一行的长度
  • 选择最大行长
  • 使用QTextEdit::fontMetrics().width(QString str)来调查str宽度的大小
  • 我希望这可以帮助你...


    试试这个:

    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());
    
    链接地址: http://www.djcxy.com/p/49681.html

    上一篇: How to adjust QTextEdit to fit it's contents

    下一篇: How to change the position of QTextEdit