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?