2012-02-29 25 views
10

Tengo un QTextEdit que actúa como "displayer" (editable a falso). El texto que muestra es wordwrapped. Ahora deseo establecer el alto de este cuadro de texto para que el texto encaje exactamente (respetando al mismo tiempo una altura máxima).qtextedit - cambiar el tamaño para ajustar

Básicamente, el widget (en el mismo diseño vertical) debajo del diseño debe tener tanto espacio como sea posible.

¿Cómo se puede lograr esto más fácilmente?

+1

no puede encontrar en la biblioteca qtextbox QT –

+0

QTextEdit significaba, fijo (con enlace) – paul23

+0

Si ponemos la QTextEdit dentro de otro QScrollArea (para ajustar la altura máxima), se puede usar el mismo código que di allí: http: // stackoverflow .com/questions/7301785/react-on-the-resizing-of-a-qmainwindow-for-adjust-widgets-size – alexisdm

Respuesta

1

tamaño actual del texto subyacente puede estar disponible a través

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

y creo que el uso de este que podría cambiar el tamaño del widget de consecuencia.

#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();  
} 
+0

¿No se pierde el ajuste de palabras al convertirlo en un "documento"? – paul23

+0

intente compilar el código que puse en respuesta, verá la diferencia entre el tamaño del widget y el tamaño del documento contenido. El ajuste de palabras no está perdido. Pero primero debes mostrar el widget. –

+0

Bueno, esto realmente no funciona, ya que el tamaño no se establece cuando se utiliza el comando 'setText()'. – paul23

2

menos que haya algo en particular a las capacidades de un QTextEdit que necesita, un QLabel con el ajuste de línea activada va a hacer exactamente lo que quiere.

+4

Bueno, qlabel solo envía palabras sobre los límites de las palabras, ni muestra barras de desplazamiento cuando los datos son demasiado grandes. Empecé con el uso de una etiqueta, pero necesito ambos conjuntos de características que parece ... – paul23

+1

Bueno, un 'QLabel' no funcionará entonces :) –

8

¡Encontré una solución bastante estable y fácil usando 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_() 

(Perdóname, sé que tu pregunta es acerca de C++, y estoy usando Python, pero en Qt Son más o menos lo mismo que de todos modos).

0

Hablando de Python, en realidad encontré .setFixedWidth(your_width_integer) y .setFixedSize(your_width, your_height) bastante útiles. No estoy seguro si C tiene atributos de widgets similares.

0

En mi caso, puse mi QLabel dentro de un QScrollArea. Y si está interesado, combina ambos y crea tu propio widget.

Cuestiones relacionadas