Russian Qt Forum
Апрель 25, 2024, 20:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Создание табличной модели через ListView  (Прочитано 3378 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« : Январь 23, 2021, 19:22 »

Всем привет.
Столкнулся с такой задачкой, имеется модель с данными.
Одна из моделей с данными например такая
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;
}

Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 216


Просмотр профиля
« Ответ #1 : Январь 23, 2021, 19:24 »

В данном виде выглядит все вот так
https://www.dropbox.com/s/jjpoa799wgwkmop/Screenshot_20210122_141003.png?dl=0
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 22.