LINUX.ORG.RU

QML + C++(Qt) помогите разобраться с представленими

 ,


0

1

Вопрос не связан с linux.
И так. Есть задача:
есть список файлов, требуется вывести этот список в два представления:
1 - QTreeView
2 - QML ListView
Так же считается, что файлы звуковые, не пересекаются во времени. В дерево отображается имя, дата создания, длительность. В QML вся область считается временной и на нее отображается наличие файла в определенном времени (просто прямоугольниками - timeline).
К решению данной проблемы я подошел следующим образом. Вначале создаю свою модель, наследуясь от QAbstractTableModel. В модели переопределяю

    explicit FileManager(QDir currentDir, QObject *parent = 0);
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const ;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    QFileInfo fileInfo(const QModelIndex &index) const ;
    QHash<int, QByteArray> roleNames() const;
Добавляю роли для модели allocateX - начало где должен отображаться прямоугольник, allocateWidth - ширина прямоугольника. С QTreeViwe проблем нет, он эту модель принимает как родную, а вот с QML проблемы.
    ListView {
        id: listView1
        interactive: false
        orientation: ListView.Horizontal
        anchors.fill: parent
        anchors.topMargin: beginTimeText.height
        delegate:
            Item{
                Row {
                        Rectangle {
                            height: listView1.height
                            color: colorq
                            x: allocateX
                            width: allocateWidth
                        }
                    }

            }
        model: fileModel
    }
Это совсем не соответсвует тому, что должно получатся. А точнее, число allocateX не соответствует тому x, что отображается для на экране. Выглядит это так http://savepic.net/6555456.htm. Как можно увидеть, у половины файлов (зеленых прямоугольников) координата x = 0.
Внимание вопросы:
1) как исправить и в чем ошибка?
2) как сделать общий выбор? А точнее, когда выбираю файл в дереве, он выделялся (менялся цвет прямоугольника) в QML
3) как обновить представление QML при изменении модели?

-1) Не выкладывай ссылка на HTML с картинкой — это как-то по-дибильному. Давай сразу урлу с PNG

0) Выкладывай код, чтобы можно было поиграться

1) Я ничего не понял. Ты хочешь разделить область на куски, пропорциональные длинам аудиофайлов в списке? Не совсем понимаю зачем тебе в делегате Item и Row.

2) ты можешь сохранять выбранный индекс в нижней таблице и в зависимости от него проставлять цвет в делегате. Ещё, может быть, свойство highlight делегата тебе поможет. Можно ещё сделать в каждом элементе модели свойство выбранна ли она

3) С++ный код должен кидать сигналы с изменениями.

Kakadu
()
Последнее исправление: Kakadu (всего исправлений: 1)
Ответ на: комментарий от Kakadu

Кусок рабочего кода выпиливать долго, а весь проект не могу скинуть ибо комерческая тайна и все такое.
Отображать прямоугольники таким образом, что ширина пропорциональна длительности файла, а размещение времени создания.
Вот с сигналами из модели для обновления получается как то не так. По идее нужно dataChenge вызвать, после чего приложение должно обнавиться. Но вот когда в модели меняются полностью все данные то qml окошко обновляется только после принудительной перерисовки.
Что касается выделения, то я и передают цвет, однако не хочется иметь в модели цвет для представления, а в делегата использовать if нельзя. А на счет highlight, так я в понедельник попробую. Item и row тут объективно не нужны, но я уже дошёл до стадии научного тыка...

imirrori
() автор топика

В общем. Решил отказаться от qml посколько отображение простого прямоугольника тормозит при ресайзе. Простые виджеты на данный момент более эффективны.

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