Всем привет.
Столкнулся с такой задачкой, имеется модель с данными.
Одна из моделей с данными например такая
Name1: sdfsd
Name2: 34234
Name3: sdf3423fdsg
То есть 2 колонки и рандомный набор строк. Из С++ части в qml я передаю метод columnCount() чтобы Repeater знал о колличестве колонок.
Ниже привожу как сам код так и как выглядит таблица. Я предполагаю что я допускаю ошибку на стороне qml.
Надеюсь кто то сможет указать на мой недочет или что то посоветовать.
Заранее благодарю за советы.
import QtQuick 2.12
Item
{
id: root
property var model
property bool headers : false
function getSize(column)
{
return tableView.model.getSizeLongString(column)
}
ListView
{
id: tableView
anchors.top: rowHeader.bottom
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
flickableDirection: TableView.VerticalFlick
clip: true
model: root.model
delegate: Rectangle
{
id: rect
clip: true
implicitWidth: 543
implicitHeight: 22
border.width: 1
color: "red"
Repeater
{
id: celsRepeater
model: root.model.columnCount()
Rectangle
{
id: rextText
border.color: "blue"
width: root.model.getSizeLongString(index)
height: 15
Text
{
width: 50
height: 35
anchors.fill: parent
text: root.model.display
}
}
}
}
}
}
И сам С++ класс с данными
int AtaGeneral::rowCount(const QModelIndex &parent) const
{
return m_vector.size();
}
int AtaGeneral::columnCount(const QModelIndex &parent) const
{
return 2;
}
QVariant AtaGeneral::data(const QModelIndex &index, int role) const
{
if(!index.isValid())
{
return QVariant();
}
int row = index.row();
int col = index.column();
int column = index.column();
auto tmp = m_vector.at(row);
switch (role)
{
case Qt::DisplayRole:
{
if (column == RoleAttributes::Name)
return QVariant(tmp.name);
else if (column == RoleAttributes::Value)
return tmp.value;
else
return QString();
}
default:
break;
}
return QString();
}
QVariant AtaGeneral::headerData(int section, Qt::Orientation orientation, int role) const
{
return QAbstractItemModel::headerData(section, orientation, role);
}
QHash<int, QByteArray> AtaGeneral::roleNames() const
{
return { {Qt::DisplayRole, "display"} };
}
void AtaGeneral::loadData(QVector<AtaGeneralAttr > vector)
{
beginResetModel();
m_vector = vector;
endResetModel();
for(int i = 0; i < columnCount(); ++i)
{
int iColWidth = getSizeLongString(i);
resizeHeader(i, iColWidth);
}
}
int AtaGeneral::getSizeLongString(int column) const
{
int max = 0;
QFont font("times", 12);
QFontMetrics fm(font);
int pixelsWide = 0;
int pixelsHigh = fm.height();
for (const auto &item : m_vector)
{
if (column == 0)
{
pixelsWide = fm.horizontalAdvance(QString(item.name));
if (max < pixelsWide)
max = pixelsWide;
}
else if (column == 1)
{
pixelsWide = fm.horizontalAdvance(QString(item.value));
if (max < pixelsWide)
max = pixelsWide;
}
}
return max < 40 ? 40 : max;
}