[Solved] Use QTreeWidget to build a filter tree for log file

  • Hi,
    I'm really new to qt, especially to QTreeWidget. The final conceptual question is below (after the tree example)

    Suppose I have a ready huge log file, each line is comma-separated and consists of several headers and then the log msg itself.
    My purpose is to build a filter tree to filter each log line by headers.

    Here are a few log-lines for example:
    LOG_FILE , Header0001 , Header0002 , Header0003 , Header0004 , MSG1
    LOG_FILE , Header0001 , Header0002 , Header0003 , Header0014 , MSG2
    LOG_FILE , Header0001 , Header0002 , Header0003 , Header0024 , MSG3
    LOG_FILE , Header0001 , Header0002 , Header0003 , Header0034 , MSG4

    LOG_FILE , Header0001 , Header0002 , Header0013 , Header0004 , MSG5
    LOG_FILE , Header0001 , Header0002 , Header0013 , Header0014 , MSG6
    LOG_FILE , Header0001 , Header0002 , Header0013 , Header0024 , MSG7
    LOG_FILE , Header0001 , Header0002 , Header0013 , Header0034 , MSG8

    So I need to build a filter tree (checkable) like the following:


    What I can't handle is:
    If I read line by line, each log line, I split it into QStringList, so I have all the headers in a list and the MSG as the last QString.
    I can't find a way to determine if this series of QStrings exists in the tree yet.
    If exists - no need to add anything.
    If doesn't exists - I want to find the deepest last string's QTreeWidgetItem* that is common to the new series, so that I could then attach the rest of headers from that point.

    If I could have had the access to the list of items at depth-level i - then I could check if it consists the i-th header, go up in the hierarchy and check that the ancestors are really the previous headers, run it from the last header in the list, and thus detect the last uncommon string. But I don't know if there exists such func to get the list of all items at depth-level i... and it seems also not such efficient.

    Please help :( It's part of my project before army and no idea how to handle this.
    I'm sure there must be a simple way to determine if there is a route of a series in the tree and detect the place it becomes uncommon.
    Any ideas?

    Thanks a lot.

  • Got it!
    Thanks to the post here:
    and a little change of it:

    void MainWindow::visitTree(QStringList &list, QTreeWidgetItem *item, int currLevel, int finalLevel)
    if(currLevel == (finalLevel - 1))
    for(int i = 0, cCount = item->childCount(); i < cCount; i++)
    list << item->child(i)->text(0);
    for(int i = 0; i < item->childCount(); i++)
    visitTree(list, item->child(i), currLevel+1, finalLevel);

    void MainWindow::getListOfItemsAtLevelN(QTreeWidget *tree, QStringList& list, int finalLevel)
    for(int i=0;i<tree->topLevelItemCount();++i)
    visitTree(list, tree->topLevelItem(i), 0, finalLevel);

    call it:
    QStringList list;
    getListOfItemsAtLevelN(tree, list, 2);
    for(int i=0; i<list.count(); i++)

    P.S: it doesn't work if you pass 0, but for that we can simply use the topItemBLABLABLAs functions.

    Thanks anyway!

  • You can mark the post [SOLVED].


  • where? :/

  • Editing the title like this: [SOLVED] Use QTreeWidget to build a filter tree for log file.

Log in to reply

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.