Создание моей собственной модели в QT - PullRequest
0 голосов
/ 24 ноября 2011

Я создал свой собственный класс модели:

    #ifndef FILE_LISTING_MODEL_H
    #define FILE_LISTING_MODEL_H

    #include <QAbstractItemModel>
    #include <QStringList>

    class File_Listing_Model : public QAbstractItemModel
    {
        Q_OBJECT
    private:
        QStringList selected_files_;
    public:
        explicit File_Listing_Model(QObject *parent = 0);
        virtual int columnCount(const QModelIndex & parent = QModelIndex()) const;
        virtual QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
        virtual QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const;
        virtual QModelIndex parent(const QModelIndex & index) const;
        virtual int rowCount(const QModelIndex & parent = QModelIndex()) const;
        void set_model_data(const QStringList&);
    signals:

    public slots:

    };

    #endif // FILE_LISTING_MODEL_H
    #include "File_Listing_Model.h"

    File_Listing_Model::File_Listing_Model(QObject *parent) :
        QAbstractItemModel(parent)
    {
    }

    int File_Listing_Model::columnCount(const QModelIndex & /*parent*/) const
    {
        return 1;
    }

    QVariant File_Listing_Model::data(const QModelIndex & index, int role) const
    {
        if (role == Qt::DisplayRole)
        {
            return selected_files_.at(0);//THIS IS JUST A DUMMY
        }
        else
        {
            return QVariant();
        }

    }

    QModelIndex File_Listing_Model::index(int row, int column, const QModelIndex &/* parent*/) const
    {
        return createIndex(row,column);
    }

    QModelIndex File_Listing_Model::parent(const QModelIndex & index) const
    {
        return QModelIndex();
    }

    int File_Listing_Model::rowCount(const QModelIndex & /*parent*/) const
    {
        return selected_files_.count();
    }

    void File_Listing_Model::set_model_data(const QStringList& data)
    {
        selected_files_ = data;
    }

Затем я установил эту модель в своем диалоговом классе, который выглядит следующим образом:

#ifndef DIALOG_H
#define DIALOG_H

#include "ui_Dialog.h"
#include "File_Listing_Model.h"
class Dialog : public QDialog, private Ui::Dialog
{
    Q_OBJECT
private:
    File_Listing_Model* model_;
private slots:
    void add_files();
public:
    explicit Dialog(QWidget *parent = 0);
};

#endif // DIALOG_H

#include "Dialog.h"
#include <QFileDialog>
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),model_(new File_Listing_Model(this))
{
    setupUi(this);
    listView->setModel(model_);
}

void Dialog::add_files()
{
    QStringList tmp = QFileDialog::getOpenFileNames();

    if (!tmp.isEmpty())
    {
        model_->set_model_data(tmp);
    }
}

К сожалению, после выбора файлов с помощьюдобавить файлы, которые подключены к слоту add_files (), ничего не отображается в listView в моем диалоге
dialog.
Кто-нибудь знает, как это решить?

Ответы [ 4 ]

1 голос
/ 25 ноября 2011

Модель должна быть проинформирована о том, что вы добавили / изменили данные. Начиная с Qt 4.6, если вы устанавливаете данные одним нажатием, вы можете изменить функцию set_model_data () на:

void File_Listing_Model::set_model_data(const QStringList& data)
{
    beginResetModel();
    selected_files_ = data;
    endResetModel();
}
1 голос
/ 24 ноября 2011

Проверьте функцию beginInsertRows:

Эта функция излучает сигнал rowAboutToBeInserted (), который должны обрабатывать подключенные представления (или прокси-серверы) перед вставкой данных.В противном случае представления могут оказаться в недопустимом состоянии.

Аналогичным образом вам нужно вызвать endInsertRows, чтобы уведомить представление о том, что вставка завершена.

Итак, ваша set_model_data функция должна быть:

void File_Listing_Model::set_model_data(const QStringList& data)
{
    beginInsertRows();
    selected_files_ = data;
    endInsertRows();
}
0 голосов
/ 24 ноября 2011

Вы должны сообщить вашей модели о том, что данные изменены.Когда вы вызываете void, Dialog :: add_files () модель не знает об изменении данных.

Просто вы можете вызвать reset () или revert () для вашей модели.Но это не очень хорошая практика и она слишком медленная.

Прочтите о вставке и удалении элементов в руководстве qt.

0 голосов
/ 24 ноября 2011

Прежде всего, вы должны использовать ModelTest (http://developer.qt.nokia.com/wiki/Model_Test). Он обнаруживает наиболее распространенную ошибку и проверяет правильность вашей модели.

В вашем конкретном примере вы забыли сообщить, что модель была изменена. Представление слушает модельные сигналы и реагирует на него.

В вашей функции set_model_data() попробуйте добавить modelReset()

int File_Listing_Model::rowCount(const QModelIndex & /*parent*/) const
{
    int c = selected_files_.count();

    reset();

    return c;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...