Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Ximik от Март 08, 2009, 15:12



Название: Вопрос по MVC в Qt
Отправлено: Ximik от Март 08, 2009, 15:12
вот такой кусок кода

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->filesView->setModel(&files);
    ui->streamsView->setModel(&streams);
    connect(ui->addFileButton, SIGNAL(released()), this, SLOT(addFile()));
    connect(ui->deleteFileButton, SIGNAL(released()), this, SLOT(deleteFile()));
    //App::addFile(QString::fromUtf8("/home/alex/28")); //filesView выводит файл
}
void MainWindow::addFile()
{
    //App::addFile(QString::fromUtf8("/home/alex/Видео/28")); //filesView ничего не делает
}

Если расскоментировать первый App::addFile, то filesView показывает строчку файла, всё правильно. Но если навесить App::addFile на кнопку (второй комментарий), то, при нажатии кнопки, ничего не происходит.


В App::addFile инфа просто обрабатывается и заносится в QMap<int,QString> App::files, а в модели прописано

Код:
#include "fileslistmodel.h"

FilesListModel::FilesListModel(QObject *parent) :
        QAbstractListModel(parent)
{
}
int FilesListModel::rowCount(const QModelIndex &parent) const
{
    return App::files.count();
}
QVariant FilesListModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid()) return QVariant();
    if (role == Qt::DisplayRole) return App::files[index.row()];
    return QVariant();
}

Т.е. никаких insertRow не используется. По документации это вроде неправильно, но почему же работает в первом случае?


Название: Re: Вопрос по MVC в Qt
Отправлено: BRE от Март 08, 2009, 15:20
Т.е. никаких insertRow не используется. По документации это вроде неправильно, но почему же работает в первом случае?
Неправильно, да.
Первый вариант срабатывает потому, что ты в контструкторе добавляешь имя файла в map. После конструирования объекта (конструктор отработал), Qt начинает рисовать твой view запрашивая информацию у модели (имя файла уже в map), поэтому все нормально. Во втором случае, ты добавил строку в map, а Qt этот факт не сообщил.


Название: Re: Вопрос по MVC в Qt
Отправлено: Ximik от Март 08, 2009, 19:25
Т.е. никаких insertRow не используется. По документации это вроде неправильно, но почему же работает в первом случае?
Неправильно, да.
Первый вариант срабатывает потому, что ты в контструкторе добавляешь имя файла в map. После конструирования объекта (конструктор отработал), Qt начинает рисовать твой view запрашивая информацию у модели (имя файла уже в map), поэтому все нормально. Во втором случае, ты добавил строку в map, а Qt этот факт не сообщил.

ясно, спасибо. Значит мне оптимально делать так?
Код:
void MainWindow::addFile()
{
    App::addFile(QString::fromUtf8("/home/alex/Видео/28.mkv"));
    ui->filesView->reset();
}


Название: Re: Вопрос по MVC в Qt
Отправлено: BRE от Март 08, 2009, 19:32
Т.е. никаких insertRow не используется. По документации это вроде неправильно, но почему же работает в первом случае?
Неправильно, да.
Первый вариант срабатывает потому, что ты в контструкторе добавляешь имя файла в map. После конструирования объекта (конструктор отработал), Qt начинает рисовать твой view запрашивая информацию у модели (имя файла уже в map), поэтому все нормально. Во втором случае, ты добавил строку в map, а Qt этот факт не сообщил.

ясно, спасибо. Значит мне оптимально делать так?
Код:
void MainWindow::addFile()
{
    App::addFile(QString::fromUtf8("/home/alex/Видео/28.mkv"));
    ui->filesView->reset();
}
А еще лучше разобраться с моделями и как положенно insertRows/removeRows.


Название: Re: Вопрос по MVC в Qt
Отправлено: Ximik от Март 08, 2009, 20:38
Т.е. никаких insertRow не используется. По документации это вроде неправильно, но почему же работает в первом случае?
Неправильно, да.
Первый вариант срабатывает потому, что ты в контструкторе добавляешь имя файла в map. После конструирования объекта (конструктор отработал), Qt начинает рисовать твой view запрашивая информацию у модели (имя файла уже в map), поэтому все нормально. Во втором случае, ты добавил строку в map, а Qt этот факт не сообщил.

ясно, спасибо. Значит мне оптимально делать так?
Код:
void MainWindow::addFile()
{
    App::addFile(QString::fromUtf8("/home/alex/Видео/28.mkv"));
    ui->filesView->reset();
}
А еще лучше разобраться с моделями и как положенно insertRows/removeRows.


Есть источник данные и функции для их обработки (у меня в App), эти данные используются моделями. Т.к. данные имеют сложные структуру, я не смог разделить их на разные модели (что я вначале и делал), поэтому и приходится делать так.

Вообще, наверное, я просто не понимаю идеалогию MVC в Qt (только начал ковырять, до этого простые фронтенды в две кнопки писал), но в том же ActionRecord такие вещи делаются просто и логично (хотя я понимаю, что сравнение неуместное).

UPD: Хотя сейчас подумал, что если использовать insertRow, но данные хранить не в моделе, а в App. Сейчас попробую такой вариант. Ещё раз, спасибо