LINUX.ORG.RU

Qt QTreeWidget и изменение высоты строки

 ,


0

1

Доброго времени суток! QTreeWidget заполняется множеством строк разной длины. Некоторые строки выходят за пределы окна и перестают быть видными. Необходимо чтобы, когда строка доходит до конца виджета переходила на новую строку. Для решения данной задачи я использовал делегат. Однако возник вопрос с sizeHint. Для вычисления значения занимаемой области строкой я использовал boundingRect, но данный метод показывал неверные значения, поэтому использовал другой подход: вручную вычислял ширину виджета и ширину строки, затем делил и полученный коэффициент умножал на высоту шрифта. Однако данный способ также не всегда работает плюс при изменении размеров окна не происходит перерасчёт высоты строки. Укажите, пожалуйста, на мои ошибки. Заранее благодарю.

#ifndef TEST_H
#define TEST_H
 
#include <QtWidgets>
#include <vkdelegate.h>
 
class Test : public QWidget
{
    Q_OBJECT
private:
    QTreeWidget *ptw;
    void dataPTW();
 public:
    Test(QWidget *pwgt = 0);
};
 
#endif // TEST_H
#include "test.h"
 
Test::Test(QWidget *pwgt) : QWidget(pwgt)
{
    ptw = new QTreeWidget;
    VKDelegate *d = new VKDelegate;
    ptw->setItemDelegate(d);
 
    ptw->setTextElideMode(Qt::ElideNone);
    ptw->setWordWrap(true);
 
    QFont font = ptw->font();
    font.setPointSize(12);
    ptw->setFont(font);
    ptw->setStyleSheet("border: none");
    ptw->header()->hide();
 
    dataPTW();
 
    QVBoxLayout *v = new QVBoxLayout;
    v->addWidget(ptw);
    setLayout(v);
}
 
void Test::dataPTW()
{
    QString text = "QListView настроен таким образом, что отображает список в виде значков по сетке, как папки в проводнике (вверху значек, под ним надпись). В моей структуре надписей должно быть две, кроме того, хотелось бы писать их разным шрифтом, поэтому вариант одной строки вида сразу отпадает.";
 
    QTreeWidgetItem* ptwItem = new QTreeWidgetItem(ptw);
    ptwItem->setText(0,"Верхний уровень");
 
    QTreeWidgetItem *textItem = new QTreeWidgetItem(ptwItem);
    textItem->setText(0,text);
 
    QString tex = "sdgsdg nsdg sdog sdig bsdg bsdogsodigh sdgiohsdioghsdigh sdgophsdioghsdiog hsiodgh";
    QTreeWidgetItem *textItem1 = new QTreeWidgetItem(ptwItem);
    textItem1->setText(0,tex);
}
#ifndef VKDELEGATE_H
#define VKDELEGATE_H
 
#include <QtWidgets>
 
class VKDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    VKDelegate(QObject *obj = 0);
    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#endif // VKDELEGATE_H
#include "vkdelegate.h"
 
VKDelegate::VKDelegate(QObject *obj) : QStyledItemDelegate(obj) {}
 
void VKDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                       const QModelIndex &index) const
{
    QRectF op = painter->boundingRect(option.rect, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap,
                          index.model()->data(index).toString());
 
    painter->drawText(op, Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap,
                      index.model()->data(index).toString());
 
}
 
QSize VKDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    qDebug() << "sizeHint";
 
    int widthWidget = option.widget->width();
    QFontMetrics fm = option.fontMetrics;
    int widthStr = fm.width(index.model()->data(index).toString());
    int k;
    if(widthWidget >= widthStr)
        k = 1;
    else if(widthWidget < widthStr)
        k = qCeil(widthStr / widthWidget) + 1;
    return QSize(widthWidget, fm.height() * k);
 
 //   QRect opt = option.fontMetrics.boundingRect(option.rect,Qt::AlignLeft | Qt::AlignTop | Qt::TextWordWrap, index.model()->data(index).toString());
 //   return opt.size();
}
#include "test.h"
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Test t;
    t.show();
    return app.exec();
}

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.