Допълнителни полета към QTreeWidgetItem
-
wrote on 27 Feb 2014, 09:43 last edited by
Здравейте,
искам да добавя 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.
Мерси! -
wrote on 28 Feb 2014, 08:42 last edited by
Здравей,
аз бих ти препоръчал да си направиш свой модел. QTreeWidgetItem е просто начин за изобразяване. Като цяло концепцията в Qt и обектно ориентираното програмиране е данните да са отделно от представянето им. Така информацията седи в модела и представянето(вюто) само получава известие за промени.
Иначе, това, което си написал, не става, защото QTreeWidgetItem няма дефаултен конструктор. Направи си поне един конструктор, който да вика някой от констукторите на QTreeWidgetItem.
Но пак ти препоръчвам, особено, ако тази информация, която добавяш, ще се използва в логиката на програмата и за други цели, е да използваш собствен модел, който наследява QAbstractItemModel.
Така, че можеш да оставиш TreeView-то само да се грижи, кое и как да прерисува. Защото в момента, ако нещо то тези данни се промени, ти ще трябва да се грижиш как да бъдат проказани, кога да бъдат показани, може би и собствена имплементация на алгоритъма за изрисуването им ще трябва ии става много сложно. -
wrote on 28 Feb 2014, 08:56 last edited by
Мерси, мислех да го сменя с модел, но все го отлагах :) Иначе в момента всичко работи перфектно с изключение, че ми трябваше да пазя допълнително инфо за файл/директория.
В такъв случай направо ще го сменя с модел. -
wrote on 28 Feb 2014, 09:00 last edited by
И аз съм съгласен с @task_struct. QTreeWidget е визуален компонент, а не контейнер за съхранение на данни.
Няма смисъл да си правиш сам живота труден. Можеш да конфигурираш колко колони да има и как да изглежда QTreeWidget, после да добавиш QTreeWidgetItem с инфо за всяка колона на всеки ред, но данните трябва са съхраняваш отделно от визуалната част. -
wrote on 1 Mar 2014, 16:52 last edited by
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.
-
wrote on 4 Mar 2014, 09:38 last edited by
Qt::UserRole ми вършеше работа като пазеше само инфо дали съответният Item е директория или файл, но за повече от това не мога да го ползвам. Ще разуча нещата с model/view.
Мерси за отговорите.
6/6