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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вопрос по MVC в Qt  (Прочитано 4351 раз)
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 не используется. По документации это вроде неправильно, но почему же работает в первом случае?
Записан
BRE
Гость
« Ответ #1 : Март 08, 2009, 15:20 »

Т.е. никаких insertRow не используется. По документации это вроде неправильно, но почему же работает в первом случае?
Неправильно, да.
Первый вариант срабатывает потому, что ты в контструкторе добавляешь имя файла в map. После конструирования объекта (конструктор отработал), Qt начинает рисовать твой view запрашивая информацию у модели (имя файла уже в map), поэтому все нормально. Во втором случае, ты добавил строку в map, а Qt этот факт не сообщил.
Записан
Ximik
Гость
« Ответ #2 : Март 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();
}
Записан
BRE
Гость
« Ответ #3 : Март 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.
Записан
Ximik
Гость
« Ответ #4 : Март 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. Сейчас попробую такой вариант. Ещё раз, спасибо
« Последнее редактирование: Март 08, 2009, 20:47 от Ximik » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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