Populate QTreeView as parent and child nodes from database
I have data stored in the following columns in the database
|AcName|ActCod|GroupCode|
|parent1| |1| |0|
|child1| |101| |1|
|parent2| |2| |0|
|child2| |201| |2|
I am using a QTreeView
, QStandardItemModel
, and QStandardItem
to create this treeview however I don't know how to append the child to the parent.
I stored QStandardItem
items into a QMap
but how do I append child nodes to parent and parent nodes to rootNode
?
the code.
standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
QSqlQuery *itemqry = new QSqlQuery("SELECT GroupCode, AcName, ActCod from adm_ac");
while(itemqry->next()){
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
rowItemMap.insert(groupcode, itemmap);
}
}
ui->treeView->setModel(standardModel);
the header file.
QStandardItemModel *standardModel;
QStandardItem *acName1;
QStandardItem *acName2;
QMap<int, QStandardItem*> rowItemMap;
c++ qt qt5 qtreeview qstandarditemmodel
add a comment |
I have data stored in the following columns in the database
|AcName|ActCod|GroupCode|
|parent1| |1| |0|
|child1| |101| |1|
|parent2| |2| |0|
|child2| |201| |2|
I am using a QTreeView
, QStandardItemModel
, and QStandardItem
to create this treeview however I don't know how to append the child to the parent.
I stored QStandardItem
items into a QMap
but how do I append child nodes to parent and parent nodes to rootNode
?
the code.
standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
QSqlQuery *itemqry = new QSqlQuery("SELECT GroupCode, AcName, ActCod from adm_ac");
while(itemqry->next()){
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
rowItemMap.insert(groupcode, itemmap);
}
}
ui->treeView->setModel(standardModel);
the header file.
QStandardItemModel *standardModel;
QStandardItem *acName1;
QStandardItem *acName2;
QMap<int, QStandardItem*> rowItemMap;
c++ qt qt5 qtreeview qstandarditemmodel
How do you identify that one row is a child of another row ?, We could assume many things with the table you show, but it is better if you indicate it clearly
– eyllanesc
Nov 21 '18 at 18:46
GroupCode of child element matches the ActCod of parent element.
– user2185284
Nov 21 '18 at 19:00
Did my solution work for you? Any feedback?
– eyllanesc
Nov 22 '18 at 18:22
add a comment |
I have data stored in the following columns in the database
|AcName|ActCod|GroupCode|
|parent1| |1| |0|
|child1| |101| |1|
|parent2| |2| |0|
|child2| |201| |2|
I am using a QTreeView
, QStandardItemModel
, and QStandardItem
to create this treeview however I don't know how to append the child to the parent.
I stored QStandardItem
items into a QMap
but how do I append child nodes to parent and parent nodes to rootNode
?
the code.
standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
QSqlQuery *itemqry = new QSqlQuery("SELECT GroupCode, AcName, ActCod from adm_ac");
while(itemqry->next()){
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
rowItemMap.insert(groupcode, itemmap);
}
}
ui->treeView->setModel(standardModel);
the header file.
QStandardItemModel *standardModel;
QStandardItem *acName1;
QStandardItem *acName2;
QMap<int, QStandardItem*> rowItemMap;
c++ qt qt5 qtreeview qstandarditemmodel
I have data stored in the following columns in the database
|AcName|ActCod|GroupCode|
|parent1| |1| |0|
|child1| |101| |1|
|parent2| |2| |0|
|child2| |201| |2|
I am using a QTreeView
, QStandardItemModel
, and QStandardItem
to create this treeview however I don't know how to append the child to the parent.
I stored QStandardItem
items into a QMap
but how do I append child nodes to parent and parent nodes to rootNode
?
the code.
standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
QSqlQuery *itemqry = new QSqlQuery("SELECT GroupCode, AcName, ActCod from adm_ac");
while(itemqry->next()){
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
rowItemMap.insert(groupcode, itemmap);
}
}
ui->treeView->setModel(standardModel);
the header file.
QStandardItemModel *standardModel;
QStandardItem *acName1;
QStandardItem *acName2;
QMap<int, QStandardItem*> rowItemMap;
c++ qt qt5 qtreeview qstandarditemmodel
c++ qt qt5 qtreeview qstandarditemmodel
edited Nov 25 '18 at 6:04
eyllanesc
74.5k103156
74.5k103156
asked Nov 21 '18 at 18:10
user2185284user2185284
108110
108110
How do you identify that one row is a child of another row ?, We could assume many things with the table you show, but it is better if you indicate it clearly
– eyllanesc
Nov 21 '18 at 18:46
GroupCode of child element matches the ActCod of parent element.
– user2185284
Nov 21 '18 at 19:00
Did my solution work for you? Any feedback?
– eyllanesc
Nov 22 '18 at 18:22
add a comment |
How do you identify that one row is a child of another row ?, We could assume many things with the table you show, but it is better if you indicate it clearly
– eyllanesc
Nov 21 '18 at 18:46
GroupCode of child element matches the ActCod of parent element.
– user2185284
Nov 21 '18 at 19:00
Did my solution work for you? Any feedback?
– eyllanesc
Nov 22 '18 at 18:22
How do you identify that one row is a child of another row ?, We could assume many things with the table you show, but it is better if you indicate it clearly
– eyllanesc
Nov 21 '18 at 18:46
How do you identify that one row is a child of another row ?, We could assume many things with the table you show, but it is better if you indicate it clearly
– eyllanesc
Nov 21 '18 at 18:46
GroupCode of child element matches the ActCod of parent element.
– user2185284
Nov 21 '18 at 19:00
GroupCode of child element matches the ActCod of parent element.
– user2185284
Nov 21 '18 at 19:00
Did my solution work for you? Any feedback?
– eyllanesc
Nov 22 '18 at 18:22
Did my solution work for you? Any feedback?
– eyllanesc
Nov 22 '18 at 18:22
add a comment |
2 Answers
2
active
oldest
votes
One possible is to save the ActCod
in a role and then do a parent search through GroupCode
using the match()
method:
#include <QtWidgets>
#include <QtSql>
static bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"Cannot open databasen"
"Unable to establish a database connection.n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.nn"
"Click Cancel to exit.";
return false;
}
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent1", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child1", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent2", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child2", 201, 2)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("A", 10000, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("B", 10001, 201)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("C", 100000, 10000)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("D", 100001, 10001)");
return true;
}
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
int main(int argc, char *argv)
{
QApplication a(argc, argv);
if(!createConnection())
return -1;
QStandardItemModel model;
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
model.invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = model.match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = model.itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
QTreeView w;
w.setModel(&model);
w.expandAll();
w.show();
return a.exec();
}
In your case:
// ...
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
// ...
standardModel = new QStandardItemModel(this);
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
standardModel->invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = standardModel->match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = standardModel->itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
ui->treeView->setModel(standardModel);
The advantage is that we do not have to create a container like QMap, and thus we can avoid problems of accessing not allowed memory as well as duplicity of elements.
UPDATE1:
// ...
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("EXPENSES", 5, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("SALES", 4, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ASSETS", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CAPITAL", 3, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LIAILITIES", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CURRENT ASSETS", 102, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("FIXED ASSETS", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("INTANGIBLE FIXED ASSETS", 10102, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCUM.DEP. FIXED ASSETS", 10103, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("TANGIBLE FIXED ASSETS", 10101, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MACHINERY", 1010102, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTERS", 1010103, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LAND", 1010101, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("OFFICE EQUIPMENTS", 1010104, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MOTOR VEHICLES", 1010105, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTER SOFTWARE", 1010203, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("GOODWILL", 10102001, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("PATENTS & TRADE MARKS", 10102002, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MOTOR VEHICLES", 10103004, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- OFFICE EQUIPMENTS", 10103003, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MACHINERY", 10103001, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- COMPUTERS", 10103002, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCOUNTS RECEIVABLE", 10205, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("STOCK", 1010105, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("DEPOSITS & PREPAYMENTS", 10212, 102)");
return true;
// ...
UPDATE2:
I forgot to mention that in my solution I assumed that the data was ordered since in my algorithm I consider that the parent is before the children but in the general case it is not correct, so it must be ordered using: ORDER BY ActCod ASC
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac ORDER BY ActCod ASC");
This works but it does not go for deeper menus. e.g. rootNode only has parent items which is correct, but every parrent can have multiple child, and each child can also have multiple children of it's own. Your code somewhat works but it also misplaces the nodes under other nodes which do not have any parent-child relationship that is matching theGroupCode
toActCod
see this image: link
– user2185284
Nov 22 '18 at 18:43
@user2185284 Strange, just in my example I implemented a similar example to show that my solution works for several levels, if you are using sqlite you could share the .db, or if you are using another database you could share a .sql that contains the data. Are you using my last code?
– eyllanesc
Nov 22 '18 at 18:48
@user2185284 I see that there are Group Code empty but in the table that you show in your question are 0, do not you think that would bring problems?
– eyllanesc
Nov 22 '18 at 18:51
@user2185284 I just tested your data and it works correctly as my update shows
– eyllanesc
Nov 22 '18 at 19:13
@user2185284 If you have used my second code I just realized that I had errors, please try it again :-)
– eyllanesc
Nov 22 '18 at 19:31
|
show 8 more comments
Here is an other way to build your tree. This code take care also the case that child nodes were loaded before its parent. The tree will be built in two pass :
- Load all items to the map
- Build the tree from the map
EDIT: We use setData() function instead of setProperty since QStardardItem is not QObject derived.
enum GroupCodeRoleEnum{
GroupCodeRole = Qt::UserRole + 1001,
};
while(itemqry->next())
{
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
itemMap->setData(groupcode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
rowItemMap.insert(ActCod, itemmap) );
} //End of while -- every node were now loaded.
//build the tree
rowItemMap.insert (0, rootNode ) ;
foreach( QStandardItem * p, rowItemMap.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = rowItemMap.find( groupCode );
if( it != rowItemMap.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
TEST CODE:
QStandardItemModel *standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
//Simulate your while() loop.
addItem(1, 0, "parent 1");
addItem(101, 1, "child 1");
addItem(2, 0, "parent 2");
addItem(201, 2, "child 2");
//childs were loaded before parents
addItem(301, 3, "child 3");
addItem(401, 4, "child 4");
addItem(501, 5, "child 5");
addItem(3, 2, "parent 3");
addItem(4, 2, "parent 4");
addItem(5, 2, "parent 5");
//build the tree
m_map.insert (0, rootNode ) ;
foreach( QStandardItem * p, m_map.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = m_map.find( groupCode );
if( it != m_map.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
}
void MainWindow::addItem(int Act, int nGroupCode, QString szName)
{
QStandardItem *itemmap = new QStandardItem( szName );
itemmap->setData(nGroupCode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
m_map.insert(Act, itemmap);
}
The tree was built :
class QStandardItem has no member named setProperty, Property
. VariablepNode
is also not declared, did you mean to use the variablep
?
– user2185284
Nov 22 '18 at 18:00
@user2185284: yes, pNode mean p, QStandardItem is not QObject derived so setProperty does not work. I modified my answer to correct it, please give it a try.
– tunglt
Nov 22 '18 at 18:26
With this code the treeView remains empty
– user2185284
Nov 23 '18 at 11:02
@user2185284: the root's groupCode is 0 as described in your question ? or my setData() does not work :(
– tunglt
Nov 23 '18 at 11:22
root's groupcode is empty. so it is zero. How does the test code still work?
– user2185284
Nov 24 '18 at 14:09
|
show 4 more comments
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53418180%2fpopulate-qtreeview-as-parent-and-child-nodes-from-database%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
One possible is to save the ActCod
in a role and then do a parent search through GroupCode
using the match()
method:
#include <QtWidgets>
#include <QtSql>
static bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"Cannot open databasen"
"Unable to establish a database connection.n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.nn"
"Click Cancel to exit.";
return false;
}
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent1", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child1", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent2", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child2", 201, 2)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("A", 10000, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("B", 10001, 201)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("C", 100000, 10000)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("D", 100001, 10001)");
return true;
}
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
int main(int argc, char *argv)
{
QApplication a(argc, argv);
if(!createConnection())
return -1;
QStandardItemModel model;
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
model.invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = model.match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = model.itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
QTreeView w;
w.setModel(&model);
w.expandAll();
w.show();
return a.exec();
}
In your case:
// ...
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
// ...
standardModel = new QStandardItemModel(this);
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
standardModel->invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = standardModel->match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = standardModel->itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
ui->treeView->setModel(standardModel);
The advantage is that we do not have to create a container like QMap, and thus we can avoid problems of accessing not allowed memory as well as duplicity of elements.
UPDATE1:
// ...
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("EXPENSES", 5, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("SALES", 4, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ASSETS", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CAPITAL", 3, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LIAILITIES", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CURRENT ASSETS", 102, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("FIXED ASSETS", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("INTANGIBLE FIXED ASSETS", 10102, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCUM.DEP. FIXED ASSETS", 10103, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("TANGIBLE FIXED ASSETS", 10101, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MACHINERY", 1010102, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTERS", 1010103, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LAND", 1010101, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("OFFICE EQUIPMENTS", 1010104, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MOTOR VEHICLES", 1010105, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTER SOFTWARE", 1010203, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("GOODWILL", 10102001, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("PATENTS & TRADE MARKS", 10102002, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MOTOR VEHICLES", 10103004, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- OFFICE EQUIPMENTS", 10103003, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MACHINERY", 10103001, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- COMPUTERS", 10103002, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCOUNTS RECEIVABLE", 10205, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("STOCK", 1010105, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("DEPOSITS & PREPAYMENTS", 10212, 102)");
return true;
// ...
UPDATE2:
I forgot to mention that in my solution I assumed that the data was ordered since in my algorithm I consider that the parent is before the children but in the general case it is not correct, so it must be ordered using: ORDER BY ActCod ASC
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac ORDER BY ActCod ASC");
This works but it does not go for deeper menus. e.g. rootNode only has parent items which is correct, but every parrent can have multiple child, and each child can also have multiple children of it's own. Your code somewhat works but it also misplaces the nodes under other nodes which do not have any parent-child relationship that is matching theGroupCode
toActCod
see this image: link
– user2185284
Nov 22 '18 at 18:43
@user2185284 Strange, just in my example I implemented a similar example to show that my solution works for several levels, if you are using sqlite you could share the .db, or if you are using another database you could share a .sql that contains the data. Are you using my last code?
– eyllanesc
Nov 22 '18 at 18:48
@user2185284 I see that there are Group Code empty but in the table that you show in your question are 0, do not you think that would bring problems?
– eyllanesc
Nov 22 '18 at 18:51
@user2185284 I just tested your data and it works correctly as my update shows
– eyllanesc
Nov 22 '18 at 19:13
@user2185284 If you have used my second code I just realized that I had errors, please try it again :-)
– eyllanesc
Nov 22 '18 at 19:31
|
show 8 more comments
One possible is to save the ActCod
in a role and then do a parent search through GroupCode
using the match()
method:
#include <QtWidgets>
#include <QtSql>
static bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"Cannot open databasen"
"Unable to establish a database connection.n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.nn"
"Click Cancel to exit.";
return false;
}
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent1", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child1", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent2", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child2", 201, 2)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("A", 10000, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("B", 10001, 201)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("C", 100000, 10000)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("D", 100001, 10001)");
return true;
}
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
int main(int argc, char *argv)
{
QApplication a(argc, argv);
if(!createConnection())
return -1;
QStandardItemModel model;
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
model.invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = model.match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = model.itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
QTreeView w;
w.setModel(&model);
w.expandAll();
w.show();
return a.exec();
}
In your case:
// ...
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
// ...
standardModel = new QStandardItemModel(this);
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
standardModel->invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = standardModel->match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = standardModel->itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
ui->treeView->setModel(standardModel);
The advantage is that we do not have to create a container like QMap, and thus we can avoid problems of accessing not allowed memory as well as duplicity of elements.
UPDATE1:
// ...
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("EXPENSES", 5, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("SALES", 4, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ASSETS", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CAPITAL", 3, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LIAILITIES", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CURRENT ASSETS", 102, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("FIXED ASSETS", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("INTANGIBLE FIXED ASSETS", 10102, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCUM.DEP. FIXED ASSETS", 10103, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("TANGIBLE FIXED ASSETS", 10101, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MACHINERY", 1010102, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTERS", 1010103, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LAND", 1010101, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("OFFICE EQUIPMENTS", 1010104, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MOTOR VEHICLES", 1010105, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTER SOFTWARE", 1010203, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("GOODWILL", 10102001, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("PATENTS & TRADE MARKS", 10102002, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MOTOR VEHICLES", 10103004, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- OFFICE EQUIPMENTS", 10103003, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MACHINERY", 10103001, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- COMPUTERS", 10103002, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCOUNTS RECEIVABLE", 10205, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("STOCK", 1010105, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("DEPOSITS & PREPAYMENTS", 10212, 102)");
return true;
// ...
UPDATE2:
I forgot to mention that in my solution I assumed that the data was ordered since in my algorithm I consider that the parent is before the children but in the general case it is not correct, so it must be ordered using: ORDER BY ActCod ASC
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac ORDER BY ActCod ASC");
This works but it does not go for deeper menus. e.g. rootNode only has parent items which is correct, but every parrent can have multiple child, and each child can also have multiple children of it's own. Your code somewhat works but it also misplaces the nodes under other nodes which do not have any parent-child relationship that is matching theGroupCode
toActCod
see this image: link
– user2185284
Nov 22 '18 at 18:43
@user2185284 Strange, just in my example I implemented a similar example to show that my solution works for several levels, if you are using sqlite you could share the .db, or if you are using another database you could share a .sql that contains the data. Are you using my last code?
– eyllanesc
Nov 22 '18 at 18:48
@user2185284 I see that there are Group Code empty but in the table that you show in your question are 0, do not you think that would bring problems?
– eyllanesc
Nov 22 '18 at 18:51
@user2185284 I just tested your data and it works correctly as my update shows
– eyllanesc
Nov 22 '18 at 19:13
@user2185284 If you have used my second code I just realized that I had errors, please try it again :-)
– eyllanesc
Nov 22 '18 at 19:31
|
show 8 more comments
One possible is to save the ActCod
in a role and then do a parent search through GroupCode
using the match()
method:
#include <QtWidgets>
#include <QtSql>
static bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"Cannot open databasen"
"Unable to establish a database connection.n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.nn"
"Click Cancel to exit.";
return false;
}
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent1", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child1", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent2", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child2", 201, 2)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("A", 10000, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("B", 10001, 201)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("C", 100000, 10000)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("D", 100001, 10001)");
return true;
}
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
int main(int argc, char *argv)
{
QApplication a(argc, argv);
if(!createConnection())
return -1;
QStandardItemModel model;
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
model.invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = model.match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = model.itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
QTreeView w;
w.setModel(&model);
w.expandAll();
w.show();
return a.exec();
}
In your case:
// ...
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
// ...
standardModel = new QStandardItemModel(this);
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
standardModel->invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = standardModel->match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = standardModel->itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
ui->treeView->setModel(standardModel);
The advantage is that we do not have to create a container like QMap, and thus we can avoid problems of accessing not allowed memory as well as duplicity of elements.
UPDATE1:
// ...
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("EXPENSES", 5, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("SALES", 4, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ASSETS", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CAPITAL", 3, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LIAILITIES", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CURRENT ASSETS", 102, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("FIXED ASSETS", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("INTANGIBLE FIXED ASSETS", 10102, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCUM.DEP. FIXED ASSETS", 10103, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("TANGIBLE FIXED ASSETS", 10101, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MACHINERY", 1010102, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTERS", 1010103, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LAND", 1010101, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("OFFICE EQUIPMENTS", 1010104, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MOTOR VEHICLES", 1010105, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTER SOFTWARE", 1010203, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("GOODWILL", 10102001, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("PATENTS & TRADE MARKS", 10102002, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MOTOR VEHICLES", 10103004, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- OFFICE EQUIPMENTS", 10103003, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MACHINERY", 10103001, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- COMPUTERS", 10103002, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCOUNTS RECEIVABLE", 10205, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("STOCK", 1010105, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("DEPOSITS & PREPAYMENTS", 10212, 102)");
return true;
// ...
UPDATE2:
I forgot to mention that in my solution I assumed that the data was ordered since in my algorithm I consider that the parent is before the children but in the general case it is not correct, so it must be ordered using: ORDER BY ActCod ASC
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac ORDER BY ActCod ASC");
One possible is to save the ActCod
in a role and then do a parent search through GroupCode
using the match()
method:
#include <QtWidgets>
#include <QtSql>
static bool createConnection(){
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"Cannot open databasen"
"Unable to establish a database connection.n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.nn"
"Click Cancel to exit.";
return false;
}
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent1", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child1", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("parent2", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("child2", 201, 2)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("A", 10000, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("B", 10001, 201)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("C", 100000, 10000)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("D", 100001, 10001)");
return true;
}
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
int main(int argc, char *argv)
{
QApplication a(argc, argv);
if(!createConnection())
return -1;
QStandardItemModel model;
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
model.invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = model.match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = model.itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
QTreeView w;
w.setModel(&model);
w.expandAll();
w.show();
return a.exec();
}
In your case:
// ...
enum RelationRoles{
CodeRole = Qt::UserRole + 1000,
};
// ...
standardModel = new QStandardItemModel(this);
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac");
const QSqlRecord rec = query.record();
while (query.next()) {
QString AcName = query.value(rec.indexOf("AcName")).toString();
int GroupCode = query.value(rec.indexOf("GroupCode")).toInt();
int ActCod = query.value(rec.indexOf("ActCod")).toInt();
QStandardItem *it = new QStandardItem(AcName);
it->setData(ActCod, RelationRoles::CodeRole);
if(GroupCode == 0)
standardModel->invisibleRootItem()->appendRow(it);
else{
QModelIndexList ixs = standardModel->match(model.index(0, 0),
RelationRoles::CodeRole,
GroupCode,
1,
Qt::MatchExactly| Qt::MatchRecursive);
if(ixs.size() > 0){
QStandardItem *parent = standardModel->itemFromIndex(ixs.first());
parent->appendRow(it);
}
}
}
ui->treeView->setModel(standardModel);
The advantage is that we do not have to create a container like QMap, and thus we can avoid problems of accessing not allowed memory as well as duplicity of elements.
UPDATE1:
// ...
QSqlQuery query;
if(!query.exec("CREATE TABLE adm_ac("
"AcName TEXT,"
"ActCod INTEGER,"
"GroupCode INTEGER"
")"))
qDebug()<<query.lastError().text();
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("EXPENSES", 5, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("SALES", 4, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ASSETS", 1, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CAPITAL", 3, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LIAILITIES", 2, 0)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("CURRENT ASSETS", 102, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("FIXED ASSETS", 101, 1)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("INTANGIBLE FIXED ASSETS", 10102, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCUM.DEP. FIXED ASSETS", 10103, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("TANGIBLE FIXED ASSETS", 10101, 101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MACHINERY", 1010102, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTERS", 1010103, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("LAND", 1010101, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("OFFICE EQUIPMENTS", 1010104, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("MOTOR VEHICLES", 1010105, 10101)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("COMPUTER SOFTWARE", 1010203, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("GOODWILL", 10102001, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("PATENTS & TRADE MARKS", 10102002, 10102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MOTOR VEHICLES", 10103004, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- OFFICE EQUIPMENTS", 10103003, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- MACHINERY", 10103001, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACC.DEP- COMPUTERS", 10103002, 10103)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("ACCOUNTS RECEIVABLE", 10205, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("STOCK", 1010105, 102)");
query.exec("insert into adm_ac(AcName, ActCod, GroupCode) values("DEPOSITS & PREPAYMENTS", 10212, 102)");
return true;
// ...
UPDATE2:
I forgot to mention that in my solution I assumed that the data was ordered since in my algorithm I consider that the parent is before the children but in the general case it is not correct, so it must be ordered using: ORDER BY ActCod ASC
QSqlQuery query("SELECT GroupCode, AcName, ActCod from adm_ac ORDER BY ActCod ASC");
edited Nov 25 '18 at 5:53
answered Nov 21 '18 at 20:40
eyllanesceyllanesc
74.5k103156
74.5k103156
This works but it does not go for deeper menus. e.g. rootNode only has parent items which is correct, but every parrent can have multiple child, and each child can also have multiple children of it's own. Your code somewhat works but it also misplaces the nodes under other nodes which do not have any parent-child relationship that is matching theGroupCode
toActCod
see this image: link
– user2185284
Nov 22 '18 at 18:43
@user2185284 Strange, just in my example I implemented a similar example to show that my solution works for several levels, if you are using sqlite you could share the .db, or if you are using another database you could share a .sql that contains the data. Are you using my last code?
– eyllanesc
Nov 22 '18 at 18:48
@user2185284 I see that there are Group Code empty but in the table that you show in your question are 0, do not you think that would bring problems?
– eyllanesc
Nov 22 '18 at 18:51
@user2185284 I just tested your data and it works correctly as my update shows
– eyllanesc
Nov 22 '18 at 19:13
@user2185284 If you have used my second code I just realized that I had errors, please try it again :-)
– eyllanesc
Nov 22 '18 at 19:31
|
show 8 more comments
This works but it does not go for deeper menus. e.g. rootNode only has parent items which is correct, but every parrent can have multiple child, and each child can also have multiple children of it's own. Your code somewhat works but it also misplaces the nodes under other nodes which do not have any parent-child relationship that is matching theGroupCode
toActCod
see this image: link
– user2185284
Nov 22 '18 at 18:43
@user2185284 Strange, just in my example I implemented a similar example to show that my solution works for several levels, if you are using sqlite you could share the .db, or if you are using another database you could share a .sql that contains the data. Are you using my last code?
– eyllanesc
Nov 22 '18 at 18:48
@user2185284 I see that there are Group Code empty but in the table that you show in your question are 0, do not you think that would bring problems?
– eyllanesc
Nov 22 '18 at 18:51
@user2185284 I just tested your data and it works correctly as my update shows
– eyllanesc
Nov 22 '18 at 19:13
@user2185284 If you have used my second code I just realized that I had errors, please try it again :-)
– eyllanesc
Nov 22 '18 at 19:31
This works but it does not go for deeper menus. e.g. rootNode only has parent items which is correct, but every parrent can have multiple child, and each child can also have multiple children of it's own. Your code somewhat works but it also misplaces the nodes under other nodes which do not have any parent-child relationship that is matching the
GroupCode
to ActCod
see this image: link– user2185284
Nov 22 '18 at 18:43
This works but it does not go for deeper menus. e.g. rootNode only has parent items which is correct, but every parrent can have multiple child, and each child can also have multiple children of it's own. Your code somewhat works but it also misplaces the nodes under other nodes which do not have any parent-child relationship that is matching the
GroupCode
to ActCod
see this image: link– user2185284
Nov 22 '18 at 18:43
@user2185284 Strange, just in my example I implemented a similar example to show that my solution works for several levels, if you are using sqlite you could share the .db, or if you are using another database you could share a .sql that contains the data. Are you using my last code?
– eyllanesc
Nov 22 '18 at 18:48
@user2185284 Strange, just in my example I implemented a similar example to show that my solution works for several levels, if you are using sqlite you could share the .db, or if you are using another database you could share a .sql that contains the data. Are you using my last code?
– eyllanesc
Nov 22 '18 at 18:48
@user2185284 I see that there are Group Code empty but in the table that you show in your question are 0, do not you think that would bring problems?
– eyllanesc
Nov 22 '18 at 18:51
@user2185284 I see that there are Group Code empty but in the table that you show in your question are 0, do not you think that would bring problems?
– eyllanesc
Nov 22 '18 at 18:51
@user2185284 I just tested your data and it works correctly as my update shows
– eyllanesc
Nov 22 '18 at 19:13
@user2185284 I just tested your data and it works correctly as my update shows
– eyllanesc
Nov 22 '18 at 19:13
@user2185284 If you have used my second code I just realized that I had errors, please try it again :-)
– eyllanesc
Nov 22 '18 at 19:31
@user2185284 If you have used my second code I just realized that I had errors, please try it again :-)
– eyllanesc
Nov 22 '18 at 19:31
|
show 8 more comments
Here is an other way to build your tree. This code take care also the case that child nodes were loaded before its parent. The tree will be built in two pass :
- Load all items to the map
- Build the tree from the map
EDIT: We use setData() function instead of setProperty since QStardardItem is not QObject derived.
enum GroupCodeRoleEnum{
GroupCodeRole = Qt::UserRole + 1001,
};
while(itemqry->next())
{
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
itemMap->setData(groupcode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
rowItemMap.insert(ActCod, itemmap) );
} //End of while -- every node were now loaded.
//build the tree
rowItemMap.insert (0, rootNode ) ;
foreach( QStandardItem * p, rowItemMap.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = rowItemMap.find( groupCode );
if( it != rowItemMap.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
TEST CODE:
QStandardItemModel *standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
//Simulate your while() loop.
addItem(1, 0, "parent 1");
addItem(101, 1, "child 1");
addItem(2, 0, "parent 2");
addItem(201, 2, "child 2");
//childs were loaded before parents
addItem(301, 3, "child 3");
addItem(401, 4, "child 4");
addItem(501, 5, "child 5");
addItem(3, 2, "parent 3");
addItem(4, 2, "parent 4");
addItem(5, 2, "parent 5");
//build the tree
m_map.insert (0, rootNode ) ;
foreach( QStandardItem * p, m_map.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = m_map.find( groupCode );
if( it != m_map.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
}
void MainWindow::addItem(int Act, int nGroupCode, QString szName)
{
QStandardItem *itemmap = new QStandardItem( szName );
itemmap->setData(nGroupCode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
m_map.insert(Act, itemmap);
}
The tree was built :
class QStandardItem has no member named setProperty, Property
. VariablepNode
is also not declared, did you mean to use the variablep
?
– user2185284
Nov 22 '18 at 18:00
@user2185284: yes, pNode mean p, QStandardItem is not QObject derived so setProperty does not work. I modified my answer to correct it, please give it a try.
– tunglt
Nov 22 '18 at 18:26
With this code the treeView remains empty
– user2185284
Nov 23 '18 at 11:02
@user2185284: the root's groupCode is 0 as described in your question ? or my setData() does not work :(
– tunglt
Nov 23 '18 at 11:22
root's groupcode is empty. so it is zero. How does the test code still work?
– user2185284
Nov 24 '18 at 14:09
|
show 4 more comments
Here is an other way to build your tree. This code take care also the case that child nodes were loaded before its parent. The tree will be built in two pass :
- Load all items to the map
- Build the tree from the map
EDIT: We use setData() function instead of setProperty since QStardardItem is not QObject derived.
enum GroupCodeRoleEnum{
GroupCodeRole = Qt::UserRole + 1001,
};
while(itemqry->next())
{
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
itemMap->setData(groupcode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
rowItemMap.insert(ActCod, itemmap) );
} //End of while -- every node were now loaded.
//build the tree
rowItemMap.insert (0, rootNode ) ;
foreach( QStandardItem * p, rowItemMap.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = rowItemMap.find( groupCode );
if( it != rowItemMap.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
TEST CODE:
QStandardItemModel *standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
//Simulate your while() loop.
addItem(1, 0, "parent 1");
addItem(101, 1, "child 1");
addItem(2, 0, "parent 2");
addItem(201, 2, "child 2");
//childs were loaded before parents
addItem(301, 3, "child 3");
addItem(401, 4, "child 4");
addItem(501, 5, "child 5");
addItem(3, 2, "parent 3");
addItem(4, 2, "parent 4");
addItem(5, 2, "parent 5");
//build the tree
m_map.insert (0, rootNode ) ;
foreach( QStandardItem * p, m_map.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = m_map.find( groupCode );
if( it != m_map.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
}
void MainWindow::addItem(int Act, int nGroupCode, QString szName)
{
QStandardItem *itemmap = new QStandardItem( szName );
itemmap->setData(nGroupCode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
m_map.insert(Act, itemmap);
}
The tree was built :
class QStandardItem has no member named setProperty, Property
. VariablepNode
is also not declared, did you mean to use the variablep
?
– user2185284
Nov 22 '18 at 18:00
@user2185284: yes, pNode mean p, QStandardItem is not QObject derived so setProperty does not work. I modified my answer to correct it, please give it a try.
– tunglt
Nov 22 '18 at 18:26
With this code the treeView remains empty
– user2185284
Nov 23 '18 at 11:02
@user2185284: the root's groupCode is 0 as described in your question ? or my setData() does not work :(
– tunglt
Nov 23 '18 at 11:22
root's groupcode is empty. so it is zero. How does the test code still work?
– user2185284
Nov 24 '18 at 14:09
|
show 4 more comments
Here is an other way to build your tree. This code take care also the case that child nodes were loaded before its parent. The tree will be built in two pass :
- Load all items to the map
- Build the tree from the map
EDIT: We use setData() function instead of setProperty since QStardardItem is not QObject derived.
enum GroupCodeRoleEnum{
GroupCodeRole = Qt::UserRole + 1001,
};
while(itemqry->next())
{
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
itemMap->setData(groupcode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
rowItemMap.insert(ActCod, itemmap) );
} //End of while -- every node were now loaded.
//build the tree
rowItemMap.insert (0, rootNode ) ;
foreach( QStandardItem * p, rowItemMap.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = rowItemMap.find( groupCode );
if( it != rowItemMap.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
TEST CODE:
QStandardItemModel *standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
//Simulate your while() loop.
addItem(1, 0, "parent 1");
addItem(101, 1, "child 1");
addItem(2, 0, "parent 2");
addItem(201, 2, "child 2");
//childs were loaded before parents
addItem(301, 3, "child 3");
addItem(401, 4, "child 4");
addItem(501, 5, "child 5");
addItem(3, 2, "parent 3");
addItem(4, 2, "parent 4");
addItem(5, 2, "parent 5");
//build the tree
m_map.insert (0, rootNode ) ;
foreach( QStandardItem * p, m_map.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = m_map.find( groupCode );
if( it != m_map.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
}
void MainWindow::addItem(int Act, int nGroupCode, QString szName)
{
QStandardItem *itemmap = new QStandardItem( szName );
itemmap->setData(nGroupCode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
m_map.insert(Act, itemmap);
}
The tree was built :
Here is an other way to build your tree. This code take care also the case that child nodes were loaded before its parent. The tree will be built in two pass :
- Load all items to the map
- Build the tree from the map
EDIT: We use setData() function instead of setProperty since QStardardItem is not QObject derived.
enum GroupCodeRoleEnum{
GroupCodeRole = Qt::UserRole + 1001,
};
while(itemqry->next())
{
int groupcode =itemqry->value(0).toInt();
QString acname = itemqry->value(1).toString();
int ActCod = itemqry->value(2).toInt();
QStandardItem *itemmap = new QStandardItem(acname);
itemMap->setData(groupcode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
rowItemMap.insert(ActCod, itemmap) );
} //End of while -- every node were now loaded.
//build the tree
rowItemMap.insert (0, rootNode ) ;
foreach( QStandardItem * p, rowItemMap.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = rowItemMap.find( groupCode );
if( it != rowItemMap.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
TEST CODE:
QStandardItemModel *standardModel = new QStandardItemModel(this);
QStandardItem *rootNode = standardModel->invisibleRootItem();
//Simulate your while() loop.
addItem(1, 0, "parent 1");
addItem(101, 1, "child 1");
addItem(2, 0, "parent 2");
addItem(201, 2, "child 2");
//childs were loaded before parents
addItem(301, 3, "child 3");
addItem(401, 4, "child 4");
addItem(501, 5, "child 5");
addItem(3, 2, "parent 3");
addItem(4, 2, "parent 4");
addItem(5, 2, "parent 5");
//build the tree
m_map.insert (0, rootNode ) ;
foreach( QStandardItem * p, m_map.values() ){
int groupCode = p->data( GroupCodeRole ).toInt();
//find the parent from the map
if( p != rootNode ){
QMap<int, QStandardItem* >::iterator it = m_map.find( groupCode );
if( it != m_map.end() ){
QStandardItem* pParent = it.value();
pParent->appendRow( p );
}else {
qDebug() << "Parent not exist for groupCode" << groupCode;
}
}//nomal node
} //foreach
ui->treeView->setModel(standardModel);
}
void MainWindow::addItem(int Act, int nGroupCode, QString szName)
{
QStandardItem *itemmap = new QStandardItem( szName );
itemmap->setData(nGroupCode, GroupCodeRole );
//map of ActCod to itemmap, not GroupCode
m_map.insert(Act, itemmap);
}
The tree was built :
edited Nov 23 '18 at 15:55
answered Nov 21 '18 at 21:04
tunglttunglt
60928
60928
class QStandardItem has no member named setProperty, Property
. VariablepNode
is also not declared, did you mean to use the variablep
?
– user2185284
Nov 22 '18 at 18:00
@user2185284: yes, pNode mean p, QStandardItem is not QObject derived so setProperty does not work. I modified my answer to correct it, please give it a try.
– tunglt
Nov 22 '18 at 18:26
With this code the treeView remains empty
– user2185284
Nov 23 '18 at 11:02
@user2185284: the root's groupCode is 0 as described in your question ? or my setData() does not work :(
– tunglt
Nov 23 '18 at 11:22
root's groupcode is empty. so it is zero. How does the test code still work?
– user2185284
Nov 24 '18 at 14:09
|
show 4 more comments
class QStandardItem has no member named setProperty, Property
. VariablepNode
is also not declared, did you mean to use the variablep
?
– user2185284
Nov 22 '18 at 18:00
@user2185284: yes, pNode mean p, QStandardItem is not QObject derived so setProperty does not work. I modified my answer to correct it, please give it a try.
– tunglt
Nov 22 '18 at 18:26
With this code the treeView remains empty
– user2185284
Nov 23 '18 at 11:02
@user2185284: the root's groupCode is 0 as described in your question ? or my setData() does not work :(
– tunglt
Nov 23 '18 at 11:22
root's groupcode is empty. so it is zero. How does the test code still work?
– user2185284
Nov 24 '18 at 14:09
class QStandardItem has no member named setProperty, Property
. Variable pNode
is also not declared, did you mean to use the variable p
?– user2185284
Nov 22 '18 at 18:00
class QStandardItem has no member named setProperty, Property
. Variable pNode
is also not declared, did you mean to use the variable p
?– user2185284
Nov 22 '18 at 18:00
@user2185284: yes, pNode mean p, QStandardItem is not QObject derived so setProperty does not work. I modified my answer to correct it, please give it a try.
– tunglt
Nov 22 '18 at 18:26
@user2185284: yes, pNode mean p, QStandardItem is not QObject derived so setProperty does not work. I modified my answer to correct it, please give it a try.
– tunglt
Nov 22 '18 at 18:26
With this code the treeView remains empty
– user2185284
Nov 23 '18 at 11:02
With this code the treeView remains empty
– user2185284
Nov 23 '18 at 11:02
@user2185284: the root's groupCode is 0 as described in your question ? or my setData() does not work :(
– tunglt
Nov 23 '18 at 11:22
@user2185284: the root's groupCode is 0 as described in your question ? or my setData() does not work :(
– tunglt
Nov 23 '18 at 11:22
root's groupcode is empty. so it is zero. How does the test code still work?
– user2185284
Nov 24 '18 at 14:09
root's groupcode is empty. so it is zero. How does the test code still work?
– user2185284
Nov 24 '18 at 14:09
|
show 4 more comments
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53418180%2fpopulate-qtreeview-as-parent-and-child-nodes-from-database%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
How do you identify that one row is a child of another row ?, We could assume many things with the table you show, but it is better if you indicate it clearly
– eyllanesc
Nov 21 '18 at 18:46
GroupCode of child element matches the ActCod of parent element.
– user2185284
Nov 21 '18 at 19:00
Did my solution work for you? Any feedback?
– eyllanesc
Nov 22 '18 at 18:22