Доброго времени суток!
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();
}