Wichtig man macht sich ein tree model mit dem einfachen QStandardItemModel
beispiel von datenbank mysql;
doc:
http://www.klempert.de/nested_sets/
demo:
http://www.klempert.de/nested_sets/demo/
Code: Alles auswählen
CREATE TABLE `FAKTURA_SUB` (
`id` int(12) NOT NULL auto_increment,
`root_id` int(12) NOT NULL default '0',
`name` varchar(35) NOT NULL default 'Category-Name-New',
`lft` int(12) NOT NULL default '0',
`rgt` int(12) NOT NULL default '0',
`sub_id` int(12) NOT NULL default '1',
`attribute` enum('active','passive','report_a','report_b','report_c','read','hidden') NOT NULL default 'read',
PRIMARY KEY (`id`),
UNIQUE KEY `sub_id` (`sub_id`),
KEY `root_id` (`root_id`),
KEY `lft` (`lft`),
KEY `rgt` (`rgt`)
) ENGINE=MyISAM AUTO_INCREMENT=218 DEFAULT CHARSET=utf8 AUTO_INCREMENT=218 ;
dann definiert man die sql query die den baum macht unlimitierte tiefen:
Code: Alles auswählen
#define V_TREEQUERY "SELECT n.*, round((n.rgt-n.lft-1)/2,0) AS childs, count(*)+(n.lft>1) AS level, ((min(p.rgt)-n.rgt-(n.lft>1))/2) > 0 AS lower, (( (n.lft-max(p.lft)>1) )) AS upper FROM FAKTURA_SUB n, FAKTURA_SUB p WHERE n.lft BETWEEN p.lft AND p.rgt AND (p.root_id = n.root_id) AND (p.id != n.id OR n.lft = 1) GROUP BY n.root_id,n.id ORDER BY n.root_id,n.lft"
man ruft die query auf...
Code: Alles auswählen
ReadModel = new QSqlQueryModel();
ReadModel->setQuery(F_TREEQUERY,db_connection); /* QSqlDatabase */
/* header auslesen */
int rowsumm = ReadModel->columnCount();
for (int x = 0; x < rowsumm; ++x) {
const int pane = x;
FieldNames.append(ReadModel->headerData(pane,Qt::Horizontal,Qt::DisplayRole).toString());
}
model = new QStandardItemModel(); //// model beginnen //////
/* header schreiben */
for (int e = 0; e < DisplayFields.size(); ++e) {
model->setHorizontalHeaderItem(e,new QStandardItem(DisplayFields.at(e)));
}
/* alle tree aufuellen vom ersten level + Compose geht in die tiefe ...*/
if (ReadModel->rowCount() > 0) {
for (int i = 0; i < ReadModel->rowCount(); ++i) {
QSqlRecord recordio = ReadModel->record(i);
if (recordio.value("level").toInt() == 1) {
model->invisibleRootItem()->appendRow(Compose(i));
}
}
}
/* und die tree selber Compose( int zeile )*/
QList<QStandardItem *> Classe::Compose( int rowposition )
{
QSqlRecord r = ReadModel->record(rowposition);
int level;
int childs;
QString RowPositionString,DBid;
RowPositionString.setNum(rowposition);
QList<QStandardItem *> diritto;
for (int x = 0; x < DisplayFields.size(); ++x) {
level = r.value("level").toInt();
childs = r.value("childs").toInt();
DBid = r.value("id").toString();
const QString Fname = DisplayFields.at(x);
QStandardItem *item = new QStandardItem(r.value(Fname).toString());
item->setFlags ( Qt::ItemIsEnabled );
item->setToolTip ("["+RowPositionString+"] - (ID:"+DBid+") - " + r.value(Fname).toString() + " - FieldName" + Fname );
if (x == 0) {
if (level == 4) {
item->setIcon ( QIcon(QString::fromUtf8(":/img/cassa_movimento.png")) );
} else {
item->setIcon ( QIcon(QString::fromUtf8(":/img/info.png")) );
}
}
diritto.append(item);
}
if (!OnBox(rowposition)) { /* nicht 2 mal nehmen die gleiche position */
RowUnique.insert(rowposition,level);
}
if (childs > 0 ) {
for (int i = 0; i < childs; ++i) {
const int jumpto = i + 1 + rowposition;
if (!OnBox(jumpto)) {
diritto.first()->appendRow(Compose(jumpto));
}
}
}
return diritto;
}
/* die model zum qui tree QTreeWidget bringen */
cat_tree->setModel(model);
cat_tree->expandAll();
for (int e = 0; e < DisplayFields.size(); ++e) {
cat_tree->resizeColumnToContents(e);
}
cat_tree->hideColumn(DisplayFields.size() - 1);
cat_tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
cat_tree->setSortingEnabled(false);
cat_tree->setSelectionBehavior(QAbstractItemView::SelectRows);
cat_tree->setSelectionMode(QAbstractItemView::NoSelection);
cat_tree->setAlternatingRowColors(true);
connect(cat_tree, SIGNAL(activated(QModelIndex)), this, SLOT(ActiveTre(QModelIndex)));
connect(cat_tree, SIGNAL(clicked(QModelIndex) ), this , SLOT(ActiveTre(QModelIndex) ));
/* das signal nehmen */
void Classe::ActiveTre( QModelIndex index )
{
if (!index.isValid()) {
return;
}
/* model index zugreifen auf row column xx dieser line....*/
}
/* doppelte pruefen somit die gleiche row nicht doppel ist ! */
bool classe::OnBox( int rowposition )
{
bool having = false;
QMapIterator <int,int> i(RowUnique);
while (i.hasNext()) {
i.next();
if ( rowposition == i.key()) {
having = true;
}
}
return having;
//// RowUnique.insert(int,int); CheckRow RowUnique; typedef QMap<int,int> CheckRow;
}
Naturlich geht es auch mit xml aber wenn 10 user zugreifen muessen gleichzeitig .. liber eine datenbank.....
.........................
speack português italiano deutsch english castellà qt