Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

QLabel automatisch Höhe anpassen



  • Hi!

    Ich kämpfe gerade mit einem kleinen Problem. Ich habe ein QTreeWidget in dem ich ein selbst gebautes Widget einfüge. Das funktioniert auch hervorragend soweit und ich bin immer wieder überrascht, wie gut und einfach Qt viele Dinge realisiert.

    In dem Widget werden Nachrichten angezeigt. Dafür habe ich ein QLabel, welches den Namen anzeigt und wieder ein QLabel, welches die Nachricht anzeigt.

    class chatItem : public QWidget
    {
        Q_OBJECT
    
        public:
            void showEvent(QShowEvent* event)
            {
                return;
            }
    
            chatItem()
            {
                absender = new QLabel();
                text = new QLabel();
    
                QVBoxLayout *mainBox = new QVBoxLayout();
                
                mainBox->addWidget(absender);
                mainBox->addWidget(text);
    
                setLayout(mainBox);
            }
    
            chatItem(QString von, QString nachricht, Qt::Alignment align)
            {
                absender = new QLabel(von);
                absender->setAlignment(align);
                absender->setWordWrap(true);
    
                QFont aFont = absender->font();
                aFont.setBold(true);
                absender->setFont(aFont);
    
                text = new QLabel(nachricht);
                text->setWordWrap(true);
    
                QFontMetrics fi = text->fontMetrics();
                int textSize = nachricht.count() / 30 * (fi.height() + 4);
    
                if(textSize > 0) text->setFixedHeight(textSize);
                
                QVBoxLayout *mainBox = new QVBoxLayout();
                
                mainBox->addWidget(absender);
                mainBox->addWidget(text);
    
                mainBox->setSpacing(0);
    
                mainBox->setSizeConstraint(QLayout::SetNoConstraint);
                setLayout(mainBox);
            }
    
        private slots:
    
        private:
            QLabel *absender;
            QLabel *text;
    };
    

    So sieht die Geschichte aus. Sie hat nur einen Haken. Das QLabel *text hat immer die gleiche Höhe, egal wie viel Text darin ist. Wie man am Code sehen kann, habe ich mir da eine Abhilfe geschaffen, die auch funktioniert. Das Problem dabei ist nur, da ich nicht die exakte Höhe des Fonts ermitteln kann, ist die Berechnung ungenau. Je länger der Text ist, desto mehr Platz ist nach oben und unten. Es funktioniert zwar, aber wenn da wirklich mal eine grosse Nachricht kommt, füllt die wahrscheinlich das ganze TreeWidget aus und hat mehr Platz als Inhalt.

    Hat Qt da wirklich keine Methode eingebaut, mit der das QLabel dann wirklich nur die benötigte Grösse hat?



  • Okay. Nachdem ich jetzt den ganzen Tag gesucht habe, liegt der Fehler wohl doch wo anders :(.

    Mir scheint es, dass mein chatItem von dem QTreeWidget für seine Zeile eine Grösse vorgegeben bekommt. Ich finde aber leider auch keine Möglichkeit, die Zeilenhöhe automatisch auf den Inhalt anzupassen. Die Spaltenbreite kann man ja sehr bequem anpassen, aber wie geht das mit der Höhe?


Log in to reply