14

我有一个QTextEdit,它充当“显示器”(可编辑为 false)。它显示的文本是自动换行的。现在我确实希望设置这个文本框的高度,以便文本完全适合(同时也尊重最大高度)。

基本上,布局下方的小部件(在相同的垂直布局中)应该获得尽可能多的空间。

如何最容易地做到这一点?

4

5 回答 5

11

我找到了一个非常稳定、简单的解决方案,使用QFontMetrics!

from PyQt4 import QtGui

text = ("The answer is QFontMetrics\n."
        "\n"
        "The layout system messes with the width that QTextEdit thinks it\n"
        "needs to be.  Instead, let's ignore the GUI entirely by using\n"
        "QFontMetrics.  This can tell us the size of our text\n"
        "given a certain font, regardless of the GUI it which that text will be displayed.")

app = QtGui.QApplication([])

textEdit = QtGui.QPlainTextEdit()
textEdit.setPlainText(text)
textEdit.setLineWrapMode(True)      # not necessary, but proves the example

font = textEdit.document().defaultFont()    # or another font if you change it
fontMetrics = QtGui.QFontMetrics(font)      # a QFontMetrics based on our font
textSize = fontMetrics.size(0, text)

textWidth = textSize.width() + 30       # constant may need to be tweaked
textHeight = textSize.height() + 30     # constant may need to be tweaked

textEdit.setMinimumSize(textWidth, textHeight)  # good if you want to insert this into a layout
textEdit.resize(textWidth, textHeight)          # good if you want this to be standalone

textEdit.show()

app.exec_()

(原谅我,我知道你的问题是关于 C++ 的,我使用的是 Python,但Qt无论如何它们几乎是一样的)。

于 2015-01-08T17:11:47.243 回答
2

底层文本的当前大小可以通过

QTextEdit::document()->size();

我相信使用它我们可以相应地调整小部件的大小。

#include <QTextEdit>
#include <QApplication>
#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextEdit te ("blah blah blah blah blah blah blah blah blah blah blah blah");
    te.show();
    cout << te.document()->size().height() << endl;
    cout << te.document()->size().width() << endl;
    cout <<  te.size().height() << endl;
    cout <<  te.size().width() << endl;
// and you can resize then how do you like, e.g. :
    te.resize(te.document()->size().width(), 
              te.document()->size().height() + 10);
    return a.exec();    
}
于 2012-02-29T21:37:26.100 回答
2

除非QTextEdit您需要特定于 a 的功能,否则QLabel打开自动换行将完全符合您的要求。

于 2012-02-29T22:24:37.717 回答
1

就我而言,我将 QLabel 放在 QScrollArea 中。如果你有兴趣,你可以将两者结合起来制作你自己的小部件。

于 2015-10-11T05:45:17.110 回答
0

说到 Python,我实际上发现.setFixedWidth( your_width_integer )并且.setFixedSize( your_width, your_height )非常有用。不确定 C 是否具有类似的小部件属性。

于 2015-03-03T03:15:19.467 回答