Pawello
20th August 2012, 11:05
Hi, I have a problem with creating a program based on
Basic Sort/Filter Model Example (http://qt-project.org/doc/qt-5.0/itemviews-basicsortfiltermodel.html) , but including also detailed view of each record like Master Detail Example (http://doc.qt.nokia.com/4.7-snapshot/sql-masterdetail.html). I can make normal Model from first example (I read data from txt file as QStringList separated by "_"), but I don't know how to include to each line in table additional info (e.g. in a form of QStringList) which will appear after activating record.
Here you have my code. I shortened it so there could be some logic gaps but I think this would be enough to show general idea of my program
eglowny.h
#ifndef EGLOWNY_H
#define EGLOWNY_H
#include <QMainWindow>
#include <QAbstractItemModel>
#include <QTreeView>
extern QAbstractItemModel *asd(QWidget *parent, QString file);
class Eglowny : public QMainWindow
{
Q_OBJECT
public:
explicit Eglowny(QWidget *parent = 0);
private:
void wnetrzeokna();
QGridLayout *uklad;
QWidget *wyg;
QTreeView *lista;
SortFilterProxyModel* filtr;
private slots:
void zrodlo(QAbstractItemModel *model);
};
#endif // EGLOWNY_H
eglowny.cpp
#include "eglowny.h"
Eglowny::Eglowny(QWidget *parent) :
QMainWindow(parent)
{
wnetrzeokna();
setWindowTitle("Kolekcjoner");
resize(800, 600);
}
void Eglowny::wnetrzeokna()
{
filtr = new QSortFilterProxyModel;
filtr->setDynamicSortFilter(true);
lista = new QTreeView;
lista->setRootIsDecorated(false);
lista->setAlternatingRowColors(true);
lista->setModel(filtr);
lista->setSortingEnabled(true);
uklad = new QGridLayout;
uklad->addWidget(lista, 0, 0, 1, 3);
wyg = new QWidget;
wyg->setLayout(uklad);
lista->sortByColumn(1,Qt::AscendingOrder);
setCentralWidget(wyg);
}
void Eglowny::save ()
{
QString file = QFileDialog::getSaveFileName(this, tr("Save"));
if (file.isEmpty())
return;
saveb (file);
}
void Eglowny::upload()
{
QString file
= QFileDialog::getOpenFileName(this, tr("Upload "));
if (file.isEmpty())
return;
zrodlo(asd(wyg, file));
}
void Eglowny::zrodlo(QAbstractItemModel *model)
{
filtr->setSourceModel(model);
}baza.h
#ifndef BAZA_H
#define BAZA_H
#include <QApplication>
#include <QList>
#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QMessageBox>
#include <QSet>
#include <QAbstractItemModel>
#include <QStandardItemModel>
QList<QString> ListaPodstawowychAtrybutow;
QAbstractItemModel *asd(QWidget *parent, QString file);
void saveb(QString &file);
void wypiszpodstawoweatrybuty();
QStandardItemModel *model;
void dodajwpis(QAbstractItemModel *model, QString wpist, QString wpisn, QString wpisz, QString wpisk);
#endif // BAZA_H
baza.cpp
#include "baza.h"
void saveb(QString &file)
{
QFile plikzdanymi(file);
if (!plikzdanymi.open(QFile::WriteOnly| QFile::Text))
{
////
return;
};
QTextStream plikdocelowydane (&plikzdanymi);
QString wpislinia;
while (model->rowCount()>0)
{
QList<QStandardItem*>asd= model->takeRow(0);
foreach(QStandardItem* lista,asd)
{
wpislinia.append("_"+lista->text());
}
plikdocelowydane<<wpislinia;
endl(plikdocelowydane);
asd.clear();
wpislinia.clear();
}
plikzdanymi.close();
}
QAbstractItemModel *asd(QWidget *parent, QString file)
{
QFile plik(file);
if (!plik.open(QFile::ReadOnly| QFile::Text))
{
/////
return NULL;
};
typ.clear();
atrybut.clear();
model = new QStandardItemModel(0, 4, parent);
model->setHeaderData(0, Qt::Horizontal, "0");
wypiszpodstawoweatrybuty();
int i=1;
foreach(QString podstawowyatrybut, ListaPodstawowychAtrybutow)
{
model->setHeaderData(i, Qt::Horizontal, podstawowyatrybut);
i++;
};
QFile plikzdanymi(file);
if (!plikzdanymi.open(QFile::ReadOnly| QFile::Text))
{
////////////
return;
};
QTextStream plikdane (&plikzdanymi);
QString wpislinia= plikdane.readLine();
while (!wpislinia.isNull())
{
QStringList wpislista = wpislinia.split("_");
dodajwpis(model,wpislista[0],wpislista[1],wpislista[2],wpislista[3]);
wpislinia = plikdane.readLine();
}
;
plikzdanymi.close();
return model;
}
void dodajwpis(QAbstractItemModel *model, QString wpist, QString wpisn, QString wpisz, QString wpisk)
{
model->insertRow(0);
model->setData(model->index(0,0),wpist);
model->setData(model->index(0,1),wpisn);
model->setData(model->index(0,2),wpisz);
model->setData(model->index(0,3),wpisk);
}
void wypiszpodstawoweatrybuty()
{
ListaPodstawowychAtrybutow.clear();
ListaPodstawowychAtrybutow <<"1"<<"2"<<"3";
}
Basic Sort/Filter Model Example (http://qt-project.org/doc/qt-5.0/itemviews-basicsortfiltermodel.html) , but including also detailed view of each record like Master Detail Example (http://doc.qt.nokia.com/4.7-snapshot/sql-masterdetail.html). I can make normal Model from first example (I read data from txt file as QStringList separated by "_"), but I don't know how to include to each line in table additional info (e.g. in a form of QStringList) which will appear after activating record.
Here you have my code. I shortened it so there could be some logic gaps but I think this would be enough to show general idea of my program
eglowny.h
#ifndef EGLOWNY_H
#define EGLOWNY_H
#include <QMainWindow>
#include <QAbstractItemModel>
#include <QTreeView>
extern QAbstractItemModel *asd(QWidget *parent, QString file);
class Eglowny : public QMainWindow
{
Q_OBJECT
public:
explicit Eglowny(QWidget *parent = 0);
private:
void wnetrzeokna();
QGridLayout *uklad;
QWidget *wyg;
QTreeView *lista;
SortFilterProxyModel* filtr;
private slots:
void zrodlo(QAbstractItemModel *model);
};
#endif // EGLOWNY_H
eglowny.cpp
#include "eglowny.h"
Eglowny::Eglowny(QWidget *parent) :
QMainWindow(parent)
{
wnetrzeokna();
setWindowTitle("Kolekcjoner");
resize(800, 600);
}
void Eglowny::wnetrzeokna()
{
filtr = new QSortFilterProxyModel;
filtr->setDynamicSortFilter(true);
lista = new QTreeView;
lista->setRootIsDecorated(false);
lista->setAlternatingRowColors(true);
lista->setModel(filtr);
lista->setSortingEnabled(true);
uklad = new QGridLayout;
uklad->addWidget(lista, 0, 0, 1, 3);
wyg = new QWidget;
wyg->setLayout(uklad);
lista->sortByColumn(1,Qt::AscendingOrder);
setCentralWidget(wyg);
}
void Eglowny::save ()
{
QString file = QFileDialog::getSaveFileName(this, tr("Save"));
if (file.isEmpty())
return;
saveb (file);
}
void Eglowny::upload()
{
QString file
= QFileDialog::getOpenFileName(this, tr("Upload "));
if (file.isEmpty())
return;
zrodlo(asd(wyg, file));
}
void Eglowny::zrodlo(QAbstractItemModel *model)
{
filtr->setSourceModel(model);
}baza.h
#ifndef BAZA_H
#define BAZA_H
#include <QApplication>
#include <QList>
#include <QFile>
#include <QTextStream>
#include <QStringList>
#include <QMessageBox>
#include <QSet>
#include <QAbstractItemModel>
#include <QStandardItemModel>
QList<QString> ListaPodstawowychAtrybutow;
QAbstractItemModel *asd(QWidget *parent, QString file);
void saveb(QString &file);
void wypiszpodstawoweatrybuty();
QStandardItemModel *model;
void dodajwpis(QAbstractItemModel *model, QString wpist, QString wpisn, QString wpisz, QString wpisk);
#endif // BAZA_H
baza.cpp
#include "baza.h"
void saveb(QString &file)
{
QFile plikzdanymi(file);
if (!plikzdanymi.open(QFile::WriteOnly| QFile::Text))
{
////
return;
};
QTextStream plikdocelowydane (&plikzdanymi);
QString wpislinia;
while (model->rowCount()>0)
{
QList<QStandardItem*>asd= model->takeRow(0);
foreach(QStandardItem* lista,asd)
{
wpislinia.append("_"+lista->text());
}
plikdocelowydane<<wpislinia;
endl(plikdocelowydane);
asd.clear();
wpislinia.clear();
}
plikzdanymi.close();
}
QAbstractItemModel *asd(QWidget *parent, QString file)
{
QFile plik(file);
if (!plik.open(QFile::ReadOnly| QFile::Text))
{
/////
return NULL;
};
typ.clear();
atrybut.clear();
model = new QStandardItemModel(0, 4, parent);
model->setHeaderData(0, Qt::Horizontal, "0");
wypiszpodstawoweatrybuty();
int i=1;
foreach(QString podstawowyatrybut, ListaPodstawowychAtrybutow)
{
model->setHeaderData(i, Qt::Horizontal, podstawowyatrybut);
i++;
};
QFile plikzdanymi(file);
if (!plikzdanymi.open(QFile::ReadOnly| QFile::Text))
{
////////////
return;
};
QTextStream plikdane (&plikzdanymi);
QString wpislinia= plikdane.readLine();
while (!wpislinia.isNull())
{
QStringList wpislista = wpislinia.split("_");
dodajwpis(model,wpislista[0],wpislista[1],wpislista[2],wpislista[3]);
wpislinia = plikdane.readLine();
}
;
plikzdanymi.close();
return model;
}
void dodajwpis(QAbstractItemModel *model, QString wpist, QString wpisn, QString wpisz, QString wpisk)
{
model->insertRow(0);
model->setData(model->index(0,0),wpist);
model->setData(model->index(0,1),wpisn);
model->setData(model->index(0,2),wpisz);
model->setData(model->index(0,3),wpisk);
}
void wypiszpodstawoweatrybuty()
{
ListaPodstawowychAtrybutow.clear();
ListaPodstawowychAtrybutow <<"1"<<"2"<<"3";
}