2016-07-28 5 views
1

Ich versuche, Listview und Tableview zusammen zu arbeiten.Wie wird die Datenquelle festgelegt, damit eine Listenansicht benutzerdefinierte Daten enthält? (und assoziiere mit QTableView)

Die Listview muss zur Anzeige verwendet werden, die Tabellenansicht muss zur Bearbeitung der Daten verwendet werden. Die Tabellenansicht wird bei Bedarf in einem Popup-Widget erstellt (und wird möglicherweise nie benötigt).

Ich fülle die Listenansicht beim Start aus einer Textdatei - jede Zeile eine Zeile, mit 2 Einträgen durch eine Registerkarte getrennt. Einfach.

Der Tableview wird 2 Spalten separat bearbeiten haben ... auch auf Listenansicht klicken, muss ich den ersten Teil des geteilten ...

ich ein Modell Unterklasse von QStringListModel erstellt haben abzurufen können.

QListView *m_myView = new QListView(); 
StringList *m_myList = new StringList(); 
QTextStream in(&myFile); 
while (!in.atEnd()) 
{ 
    QString temp = in.readLine(); 
    if(!temp.isEmpty()) 
     m_myList->append(temp); 
} 
myFile.close(); 
m_myView->setModel(m_myList); 

wo

class StringList : public QStringListModel 
{ 
public: 
    void append (const QString& string) 
    { 
     insertRows(rowCount(), 1); 
     QModelIndex m = index(rowCount() - 1); 
     setData(m, string, Qt::EditRole); 
     QStringList splist = string.split('\t'); 
     setData(m, splist.at(0), Qt::ToolTipRole); 
     if(splist.size() > 1) 
      setData(m, splist.at(1), Qt::StatusTipRole); 
     else 
      setData(m, "", Qt::StatusTipRole); 

     qDebug() << data(m, Qt::EditRole).toString() 
       << data(m, Qt::ToolTipRole).toString() 
       << data(m, Qt::StatusTipRole).toString(); 
    } 
}; 

Die EditRole richtig angezeigt wird, die anderen leere Strings angezeigt werden soll.

Es scheint, dass QStringListModel nichts außer EditRole speichern kann.

So bin ich mit 2 Optionen übrig - entweder die Aufteilung auf jede Auswahl, und auch beim Erstellen der Tabellenansicht, oder - was ich gerne ausprobieren würde, aber nicht weiß, wie - erstellen Sie eine QStandardItemModel, die als fungieren kann Datenquellen sowohl für die Listenansicht als auch für die Tabellenansicht, und können die benötigten Teildaten einfach per Klick abrufen.

Ich dachte, ich kann es einfach verwenden, um die Daten in Listview zu setzen (wie sie here tun).

QListView *m_myView = new QListView(); 
QStandardItemModel *m_myList = new QStandardItemModel(); 
QTextStream in(&myFile); 
int r = 0; 
while (!in.atEnd()) 
{ 
    QString temp = in.readLine(); 
    if(!temp.isEmpty()) 
    { 
     QStringList splist = temp.split('\t'); // assume I know there will be 2 strings always 
     QStandardItem *item = new QStandardItem(splist.at(0)); 
     m_myList->setItem(r, 0, item); 
     QStandardItem *item1 = new QStandardItem(splist.at(1)); 
     m_myList->setItem(r, 1, item1); 
     ++r; 
    } 
} 
myFile.close(); 
m_myView->setModel(m_myList); 

connect(m_myListView, SIGNAL(clicked(QModelIndex)), 
     this, SLOT(listChangedSlot(QModelIndex))); 

Aber dies wird nur die erste Zeichenfolge in der Listenansicht gesetzt, ich brauche wirklich beide, und ich weiß noch nicht, wie die Daten

void listChangedSlot(QModelIndex index) 
{ 
    qDebug() << m_myList->item(index.row(), 0)->data().toString() 
      << m_myList->item(index.row(), 1)->data().toString(); 
} // shows empty strings 

abzurufen oder ...
In der Ladebereich, versucht:

if(!temp.isEmpty()) 
    { 
     QStringList splist = temp.split('\t'); 
     splist.append(QString()); // so I don't need to test 
     QStandardItem *item = new QStandardItem(temp); 
     m_myList->setItem(r, 0, item); 
     QModelIndex idx = m_myList->index(r, 0); 
     QMap<int, QVariant> roles; 
     roles.insert(Qt::UserRole + 1, QVariant(splist.at(0))); 
     roles.insert(Qt::UserRole + 2, QVariant(splist.at(1))); 
     roles.insert(Qt::DisplayRole, QVariant(temp)); 
     m_myList->setItemData(idx, roles); 
     ++r; 
    } 

das funktioniert - zeigt feine und erhält den korrekten Inhalt klicken - aber scheint für den Tableview unbrauchbar.
(Und scheint, mache ich zweimal die Arbeit, mit setItem und setItemData - so technisch speichern Sie den Inhalt 3 mal).

Wie bekomme ich meine Listview haben eine Datenquelle mit 2 String-Elemente, zeigen beide, in der Lage sein, es auf eine Tabellenansicht setzen, und in der Lage, das erste Element auf Klick abrufen?

Antwort

0

dachte ich einen Weg aus der Datenquelle zwischen der Listenansicht und tableview zu teilen:

I 3 Spalten erstellen - Spalte 0 mit den kombinierten Komponenten und die Spalten 1 und 2 mit den getrennten Komponenten.

wird die Listenansicht nur Spalte 0. Für Tableview angezeigt werden, werde ich Spalte 0

Die Daten, die ich für die Verarbeitung erfordern verstecken in den Spalten 1 und 2 gespeichert werden.Die Benutzerbearbeitung der Daten in der Tabellenansicht erfordert nach dem Akzeptieren der Änderungen die Bearbeitung der entsprechenden Spalte 0.

Verwandte Themen