2012-04-03 13 views
2

Angenommen, ich möchte eine Modell-/Ansichtsarchitektur mit den Klassen QTableView und QAbstractTableModel implementieren. Also unterlasse ich die Klasse QAbstractTableModel, um die Klasse MyModel zu erstellen und die Schnittstelle QAbstractTableModel zu implementieren. Verbinden Sie dann die Instanz dieses Modells mit der setModel-Methode mit einer QTableView-Instanz.Wie kann man ein konstantes schreibgeschütztes Modell/eine reine Architektur in Qt erstellen?

#include <QtGui/QApplication> 
#include <QtGui/QTableView> 
#include "mymodel.h" 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QTableView tableView; 
    MyModel myModel(0);  
    tableView.setModel(&myModel); 
    tableView.show(); 
    return a.exec(); 
} 

Aber wie kann ich das Modell nur lesen lassen? Ich kann

const MyModel myModel(0); 

nicht deklarieren, da setModel ein nicht konstantes Argument verwendet. Ich habe nur konstante Methoden von QAbstractTableModel implementiert.

Antwort

5

Was meinst du mit const in diesem Fall? Was willst du erreichen?

Möchten Sie, dass Ihre zugrunde liegenden Daten unveränderbar sind - so dass eine Ausgabe von QTableView unmöglich wäre? Dann einfach die Bearbeitung des Modells - z. indem Sie nicht implementieren.

Beachten Sie auch, dass die standard implementation von

Qt::ItemFlags QAbstractItemModel::flags (const QModelIndex & index) const 

nicht Qt::ItemIsEditable zurück, die ausreichend ist.

Sie müssen darauf achten, das Modell nicht außerhalb der Benutzeroberfläche zu ändern (beachten Sie, dass das Ändern außerhalb der Umgebung ohne Senden entsprechender Signale zu schlechten Dingen führen kann). Aber wie es dein Code ist - das sollte kein Problem sein.

+0

Ich möchte nur in der Lage sein, das Modell von einem anderen Objekt zu übergeben eine konstante Methode dieses Objekt unter Verwendung von . Es ist kein großes Problem, aber sobald ich eine Methode nicht konstant mache, wenn sie konstant sein soll, dann verbreitet sich das auch auf andere Methoden, die diese Methode verwenden. –

+1

Ich habe Qt-Code gesehen, der sich mit einem solchen Problem beschäftigt, indem er die brutale 'const_cast'-Methode verwendet. Nicht so elegant, potentiell gefährlich, aber ... – Anonymous

+0

das ist genau das, wonach ich gesucht habe –

2

Sie können das Modell nicht konstant machen, da es Dinge gibt, die Views in der Lage sein müssen, das QAbstractItemModel-Objekt zu beeinflussen, z. B. das Erstellen persistenter Modellindizes.

Der beste Weg, um die Tatsache, dass Ihr Modell ist schreibgeschützt auf die Ansicht von QAbstractTableModel::flags Überschreiben ist die Kommunikation immer ungesetzt ItemIsEditable:

Qt::ItemFlags MyModel::flags (const QModelIndex & index) const 
{ 
    return QAbstractTableModel::flags(index) & ~Qt::ItemIsEditable; 
} 
2

Nun auf der Annahme, nur durch den Endnutzer gelesen bedeuten und nicht schreibgeschützt vom Programmierer, this article erklärt, dass das Modell nur bearbeitet werden kann, wenn Sie QAbstractItemModel::flags(), QAbstractItemModel::setData() und weniger wichtig QAbstractItemModel::setHeaderData() wieder implementieren.

Darüber hinaus kann die Funktionen, die Sie für ein Nur-Lese-Modell neu zu implementieren müssen, sind alle const:

Qt::ItemFlags TreeModel::flags(QModelIndex const & index) const { } 
QModelIndex TreeModel::index(int row, int column, QModelIndex const & parentIndex) const { } 
QModelIndex TreeModel::parent(QModelIndex const & childIndex) const { } 
QVariant TreeModel::data(QModelIndex const & index, int role) const { } 
QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const { } 
int TreeModel::rowCount(QModelIndex const & parent) const { } 
int TreeModel::columnCount(QModelIndex const & parent) const { }