Допълнителни полета към QTreeWidgetItem



  • Здравейте,
    искам да добавя 2-3 допълнителни полета към QTreeWidgetItem. Създавам дърво с директории и файлове взети по SSH и искам да пазя допълнителна информация във всеки QTreeWidgetItem като например size,path,etc.
    Тъй като не открих начин да добавям такава информация се опитах да го наследя, но нещо не ми се получава. Искам нещо подобно:
    @class sFTPitem : public QTreeWidgetItem
    {
    public:
    int size;
    int FileType;
    int uid;
    int gid;
    };@

    Но явно трябва да добавя и всички конструктори, защото примерно това:
    @thisItem->addChild(newItem);
    @

    където thisItem е sFTPitem, ми дава грешка, че addChild() иска QTreeWidgetItem.
    Предпочитам да не правя подкласове ако има начин да пазя допълнително инфо в QTreeWidgetItem.
    Мерси!



  • Здравей,

    аз бих ти препоръчал да си направиш свой модел. QTreeWidgetItem е просто начин за изобразяване. Като цяло концепцията в Qt и обектно ориентираното програмиране е данните да са отделно от представянето им. Така информацията седи в модела и представянето(вюто) само получава известие за промени.

    Иначе, това, което си написал, не става, защото QTreeWidgetItem няма дефаултен конструктор. Направи си поне един конструктор, който да вика някой от констукторите на QTreeWidgetItem.

    Но пак ти препоръчвам, особено, ако тази информация, която добавяш, ще се използва в логиката на програмата и за други цели, е да използваш собствен модел, който наследява QAbstractItemModel.
    Така, че можеш да оставиш TreeView-то само да се грижи, кое и как да прерисува. Защото в момента, ако нещо то тези данни се промени, ти ще трябва да се грижиш как да бъдат проказани, кога да бъдат показани, може би и собствена имплементация на алгоритъма за изрисуването им ще трябва ии става много сложно.



  • Мерси, мислех да го сменя с модел, но все го отлагах :) Иначе в момента всичко работи перфектно с изключение, че ми трябваше да пазя допълнително инфо за файл/директория.
    В такъв случай направо ще го сменя с модел.



  • И аз съм съгласен с @task_struct. QTreeWidget е визуален компонент, а не контейнер за съхранение на данни.
    Няма смисъл да си правиш сам живота труден. Можеш да конфигурираш колко колони да има и как да изглежда QTreeWidget, после да добавиш QTreeWidgetItem с инфо за всяка колона на всеки ред, но данните трябва са съхраняваш отделно от визуалната част.



  • Model/View е добра концепция и въпреки че съм съгласен с казаното по- горе, държа да отбележа че има решение на проблема и без Model/View архитектура.

    QTreeWidgetItem (както и всеки Q*Item ) има метод setData в който, в случая, се подава колона и роля. Ако избереш за роля Qt::DisplayRole, въпросната информация ще се вижда на преден план на уиджета. Но имаш Qt::UserRole, с който можеш да зададеш "потребителска" информация която може да се достъпи само програмно. Разбира се, можеш да добавиш няколко такива реда като ползваш Qt::UserRole, Qt::UserRole+1, Qt::UserRole+2 и т.н. или да си направиш свой enum със съответните стойности.

    Въпреки че може да се каже че е dirty hack, функционалността я има. Аз лично съм я тествал с и без модел, с qtablewidget/view и с qtreewidget/view.



  • Qt::UserRole ми вършеше работа като пазеше само инфо дали съответният Item е директория или файл, но за повече от това не мога да го ползвам. Ще разуча нещата с model/view.
    Мерси за отговорите.


Log in to reply
 

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