2014-03-07 1 views
2

Я пытаюсь реализовать следующее:Можно ли использовать QAbstractTableModel с TableView из QtQuick.Controls?

Существует 2d таблица со значениями. Мне нужно реализовать интерфейс для просмотра данных и его редактирования. Чтобы упростить синхронизацию между изменениями из пользовательского интерфейса и обновлениями таблиц, исходящими из внутреннего интерфейса, я хочу, чтобы модель сохраняла незафиксированные отредактированные значения и выставляла несколько методов для принятия/отклонения ожидающих изменений.

Из того, что я понимаю, что это достаточно легко сделать с QtWidgets + модели:

Базовая модель на QAbstractTableModel. Добавить несколько дополнительных функций для хранения/запросов ожидающих изменений и т.д. Используйте QTableView с пользовательским пунктом делегатом, который может запросить модель является ли редактируемыми ячейками, показывают неподтвержденные изменениями и т.д.

Но я озадачен о том, как реализуйте его QtQuick.Controls.TableView. Из моих экспериментов TableView не работает с QAbstractTableModel - он выполняет итерацию по первому столбцу модели и использует роли для имитации второго измерения.

Есть ли способ заставить TableView работать с QAbstractTableModel правильно? В качестве альтернативы - я могу изменить модель для использования ролей для столбцов, но я не уверен, как обращаться с другими аспектами данных ячейки (измененный флаг, неоправданное значение и т. Д.). Единственная идея, которую я имею до сих пор, - вернуть композитное (словарь) значение для каждой ячейки. Например. return QMap или QJsonObject как значение «ячейки» и интерпретировать его на стороне QML.

Есть ли другие способы сделать это? Что более эффективно, если я решит реализовать свое второе решение - QMap или QJsonObject?

ответ

1

Это пример, может быть, это поможет вам с надеждой

Предположим, что мы имеем SQLite базу данных, содержащую таблицу «туЬаЫе» с тремя столбцами «НОМ» (текст), «Prénom» (текст) и «образ» (URL как текст)

--------------------------- PRESENCEMODEL.h

#include <QSqlTableModel> 
typedef QHash<int,QByteArray> qMyHash ; 

class PresenceModel : public QSqlTableModel { 

Q_OBJECT 
Q_PROPERTY(QStringList dictionary READ dictionary NOTIFY dictionaryChanged) 
Q_PROPERTY(QString filterString READ filterString WRITE setFilterString NOTIFY filterStringChanged) 
Q_PROPERTY(qMyHash roles READ roles NOTIFY rolesChanged) 

public: 

PresenceModel(QSqlDatabase, QObject* parent = 0); 
void generateRoleNames(); 

QString filterString() const { return p_filterString; } 
void setFilterString(const QString&); 

Q_INVOKABLE QStringList getData(int currentRow); 

QVariant data(const QModelIndex&, int role) const; 

Q_INVOKABLE void insert(const QString& url, const QString& title); 
void populate(); 

QHash<int, QByteArray> roleNames() const; 
Q_INVOKABLE void p_setTable(const QString &tableName); 
QStringList dictionary() const; 
void setDictionary(const QStringList &value); 
QHash<int, QByteArray> roles() const; 



Q_SIGNALS: 

void dataChanged(); 
void gotData(); 

void rolesChanged(); 

private: 


enum ColumnRH { 
    nom= Qt::UserRole + 1, 
    prenom= Qt::UserRole + 2, 
    image= Qt::UserRole + 3 
}; 

QHash<int, QByteArray> p_roles; 
QString p_filterString; 
QStringList p_dictionary; 




}; 

- ------------------------- PRESENCEMODEL.cpp

#include "presencemodel.h" 
#include <QtCore/QDateTime> 
#include <QtSql/QSqlError> 
#include <QtSql/QSqlQuery> 
#include <QtSql/QSqlRecord> 
#include <QDebug> 

PresenceModel::PresenceModel(QSqlDatabase database, QObject *parent) 
: QSqlTableModel(parent, database) 
{ 
} 

void PresenceModel::generateRoleNames() 
{ 

    p_roles[nom] = "nom"; 
    p_roles[prenom] = "prenom"; 
    p_roles[image] = "image"; 
    } 



void PresenceModel::populate() 
{ 

select(); 

} 

void PresenceModel::insert(const QString& url, const QString& title) 
{ 

} 



QVariant PresenceModel::data(const QModelIndex& index, int role) const 
{ 
if (role < Qt::UserRole) 
    return QSqlQueryModel::data(index, role); 

const int columnId = role - Qt::UserRole; 
const QModelIndex modelIndex = createIndex(index.row(), columnId-1); 
return QSqlTableModel::data(modelIndex, Qt::DisplayRole); 

} 



QStringList PresenceModel::getData(int currentRow) 
{ 
QStringList rowDataList; 

for (int i=0;i<columnCount();i++) 

    rowDataList.append(data(this->index(currentRow,i),Qt::DisplayRole).toString()); 

emit gotData(); 

return rowDataList; 
} 


QHash<int, QByteArray> PresenceModel::roleNames() const 
{ 
return p_roles; 
} 


QHash<int, QByteArray> PresenceModel::roles() const 
{ 
return roleNames(); 
} 

--------------------------- main.cpp

int main(int argc, char *argv[]) 
{ 
QGuiApplication app(argc, argv); 

QQmlApplicationEngine engine; 

QSqlDatabase m_database = QSqlDatabase::addDatabase("QSQLITE"); 

m_database.setDatabaseName("/.../mydatabase.sqlite"); 


PresenceModel *p_pModel= new PresenceModel(m_database); 

p_pModel->setTable("mytable"); 

m_database.open(); 

QQmlContext *ctxt = engine.rootContext(); 

ctxt->setContextProperty("ppModel", (PresenceModel*) p_pModel); 

engine.load(QUrl("qrc:/main.qml")); 

return app.exec(); 

    } 

QML (извините за оформление :))

--------------------------- main.qml

Rectangle { 

    Component.OnCompleted : ppModel.populate() 
      TableView{ 
       id:tableview_actes 
       TableViewColumn{ role: "nom" ; title: "nom" ; width: 330 } 
       TableViewColumn{ role: "prenom" ; title: "prénom" ; width: 65} 
       TableViewColumn{ role: "image" ; title: "Photo" ; width:65} 

       model:ppModel 
       onCurrentRowChanged: { 
        var list= myModel.getData(currentRow) // invoke c++ function          

        console.log(list[0]) 



       } 
     Listview{ 
     model:ppModel 
     delegate: 
      Item { 
       Text{ 

        text: nom + " " +prenom // our roles 
        } 

       Image{ 
       source : image // image : url in our table 
       } 
        } 


     } 

     } 
+0

Спасибо за такой подробный ответ , но из того, что я вижу там, вы в основном подтверждаете, что я написал в вопросе. В вашей функции data() вы в основном переназначаете индекс строки + роль в строку и столбец в базовой модели таблицы Qt. – Usov

+0

Да, вы получили это, главное, чтобы играть с ** ROLES **, ** data() ** и ** role() ** functions.if вам нужна дополнительная помощь, я здесь. удачи – Redanium