Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Bulgarian
  4. Допълнителни полета към QTreeWidgetItem
Forum Update on Monday, May 27th 2025

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

Scheduled Pinned Locked Moved Bulgarian
6 Posts 4 Posters 5.6k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • F Offline
    F Offline
    Firehand
    wrote on last edited by
    #1

    Здравейте,
    искам да добавя 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.
    Мерси!

    1 Reply Last reply
    0
    • T Offline
      T Offline
      task_struct
      wrote on last edited by
      #2

      Здравей,

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

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

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

      "Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program."

      • Linu...
      1 Reply Last reply
      0
      • F Offline
        F Offline
        Firehand
        wrote on last edited by
        #3

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

        1 Reply Last reply
        0
        • L Offline
          L Offline
          leon.anavi
          wrote on last edited by
          #4

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

          http://anavi.org/

          1 Reply Last reply
          0
          • R Offline
            R Offline
            Robbin
            wrote on last edited by
            #5

            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.

            1 Reply Last reply
            0
            • F Offline
              F Offline
              Firehand
              wrote on last edited by
              #6

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

              1 Reply Last reply
              0

              • Login

              • Login or register to search.
              • First post
                Last post
              0
              • Categories
              • Recent
              • Tags
              • Popular
              • Users
              • Groups
              • Search
              • Get Qt Extensions
              • Unsolved