2017-12-08 10 views
0

Ich entwickle eine Qt-Anwendung und versuche, QTextEdit als label mit langem Text ohne Bildlaufleiste zu verwenden. In meinem UI habe ich eine QScrollArea und innerhalb davon möchte ich ein paar QTextEdit Widgets platzieren, und ich möchte nur Scrollen innerhalb QScrollArea verwenden. Problem ist, dass, egal wie ich versuche, die Größe QTextEdit Größe ändern es scheint, es hat eine maximale Höhe und Schnitte von Text, auch wenn ich die Größe manuell einstellen und QTextEdit::size gibt den richtigen Wert zurück.So passen Sie QTextEdit an den Inhalt an

Ich habe die gleiche Sache mit QLabel und es funktioniert gut, aber in diesem Fall brauche ich einige Methoden, die nur in QTextEdit zur Verfügung gestellt werden.

fand ich diesen Beitrag: Resizing QT's QTextEdit to Match Text Height: maximumViewportSize()

Und die Antwort gegeben war folgendes:

ich dieses Problem gelöst haben. Es gab 2 Dinge, die ich tun musste, um damit es funktioniert:

  1. das Widget Hierarchie Gehen Sie und stellen Sie sicher, die alle Größe Politik gemacht Sinn, um sicherzustellen, dass, wenn ein Kind-Widget wollte groß/klein sein dann würde das übergeordnete Widget dasselbe sein wollen.
  2. Dies ist die Hauptquelle des Updates. Da sich QTextEdit in einem QFrame befindet, das das Hauptwidget in einer QScrollArea ist, hat QScrollArea eine -Einschränkung, die das interne Widget nur dann skaliert, wenn die "widgetResizable" -Eigenschaft wahr ist. Die Dokumentation dafür ist hier: http://doc.qt.io/qt-4.8/qscrollarea.html#widgetResizable-prop. Die Dokumentation war mir nicht klar, bis ich mit dieser Einstellung herum spielte und es zur Arbeit brachte. In der Dokumentation scheint es, dass diese Eigenschaft nur Zeiten behandelt, in denen der Hauptscrollbereich die Größe eines Widgets (d. H. Von Eltern zu Kind) ändern möchte. Es bedeutet tatsächlich, dass, wenn das Hauptobjekt Widget im Bildlaufbereich immer die Größe ändern möchte (d. H. Kind zu Eltern), dann diese Einstellung auf True festgelegt werden muss. Also, die Moral der Geschichte ist , dass der QTextEdit-Code in overriding sizeHint korrekt war, aber die QScrollArea ignorierte den Wert aus dem Hauptrahmen sizeHint zurückgegeben.

Das Problem ist, dass ich keine Ahnung, wie die QTextEdit'sQScrollArea zugreifen widgetResizable zu ermöglichen. Kann mir jemand erklären, wie ich das erreichen oder eine andere Art der Größenanpassung vorschlagen kann, um den Inhalt perfekt anzupassen?

Antwort

0

In ui definiert ich QTextEdit *textEdit Objekt. Ich schreibe es als height skalierbare-Gehalt:

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

Hinweis: diese Arbeit, wenn Sie QTextEdit Schriftart oder -größe ändern! nur in der Höhe skalierbar (vor jeder Sache setzen Sie Ihre QTextEdit frameShape auf BOX).

wenn Sie Breite skalierbar-Gehalt machen wollen, sollten Sie diese Schritte tun:

  • lesen QTextEdit (textEdit Objekt) Text als Linie
  • berechnen jede Zeilenlänge
  • wählen maximal Zeile Zeile Länge
  • Verwendung von QTextEdit::fontMetrics().width(QString str) für
Größe in der Breite untersuchen

Ich hoffe, das Ihnen helfen kann ...

+0

Vielen Dank für die Beantwortung, das Problem ist, dass zunächst alle "\ n" neue Zeilenzeichen nicht haben - Der Text ist Wort umwickelt. Zweitens ist das Problem, dass selbst wenn ich die richtige Größe kenne, es einen Punkt gibt, an dem QTextEdit nur eine Bildlaufleiste zur Verfügung stellt, anstatt größer zu werden - und das ist mein Problem. – madasionka

+0

@madasionka Können Sie die Bildlaufleiste in irgendeiner Weise deaktivieren? –

+0

Ja, indem Sie Folgendes festlegen: 'textEdit-> setVerticalScrollBarPolicy (Qt :: ScrollBarAlwaysOff)', aber dies ändert nichts an der Tatsache, dass ein Teil des Textes abgeschnitten ist. – madasionka

0

Versuchen Sie dieses:

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

Ohne ein konkretes Beispiel ist es schwer zu beurteilen, aber ... es klingt, als ob Sie einfach nur eine QTextEdit dessen wollen sizeHint hängt von der aktuellen Dokumentgröße ab.

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

Dann nutzen Sie als ...

QScrollArea sa; 
sa.setWidgetResizable(true); 
text_edit te; 
te.setPlainText(...); 
sa.setWidget(&te); 
sa.show(); 

Es erscheint wie in den wenigen Tests erwartet arbeiten ich getan habe.

Verwandte Themen