From 10:00 CET Friday 22nd November we will adjust how the server works to deal with some recently reported problems. Therefore there may be a load problem, if you experience more problems than usual trying to access the forum then please PM AndyS or any of the moderators so they can inform me.


Jak zamienić zwykłe klasy C++ w klasy 'kompatybilne' z Qt



  • Jak zrobić, żeby obiekty tych klas można było wyświetlić w QTreeWidgetItem? Ogólnie ma to być sklep, a te klasy służą do stworzenia listy kategorii oraz produktów które się w niej znajdują. Nie wiem czy mój sposób rozwiązania tego problemu jest odpowiedni. Nie wiem jak pisać te klasy, żeby później łatwo można było je wyświetlać i używać SIGNAL i SLOT .
    Zadałem jeszcze pytanie na Qt Centre, ale niewiele mi to pomogło, próby robienia na podstawie "tego tutoriala":http://www.youtube.com/watch?v=TpkiVlOS3o4&list=SP2D1942A4688E9D63&index=21 też są marne, bo w zasadzie niewiele on pokazuje. Ktoś mógłby pomóc?

    "link do pytania":http://www.qtcentre.org/threads/54251-how-to-implement-list-of-lists-and-display-it
    @template <typename T>
    class obiektKategorii
    {

     QString nazwa;
     QList<T> lista;
    

    public:

     void ustawNazwe(QString n);
     QString dajNazwe();
     void dodaj(T element);
    
     obiektKategorii();
    

    };@

    @class obiektProduktu
    {
    protected:
    QString nazwa;
    double cena;
    public:

    virtual QString dajNazwe();
    virtual double dajCene();
    virtual void ustawCene(double c);
    virtual void ustawNazwe(QString n);
    obiektProduktu();
    

    };@



  • Do QTreeWidget możesz dodawać obiekty klasy QTreeWidgetItem. Jeśli chcesz użyć obiektów samodzielnie stworzonej klasy, to musi ona dziedziczyć po "QTreeWidgetitem":http://qt-project.org/doc/qt-4.8/qtreewidgetitem.html.

    Ogólnie rzecz biorąc (abstrahując od powyższego), aby używać "sygnałów i slotów":http://qt-project.org/doc/qt-4.8/signalsandslots.html, deklaracja klasy musi zawierać makro QOBJECT.

    Jeśli chcesz przedstawić dane w strukturze drzewiastej, to przeczytaj o "QTreeView":http://qt-project.org/doc/qt-4.8/qtreeview.html; ta klasa pozwoli Ci na zdefiniowane własnego modelu danych, co może być szczególnie przydatne w Twojej sytuacji (zapewne baza danych).

    Ogólnie: QTreeView i dziedzicząca po nim QTreeWidget to klasy pozwalające na przedstawienie danych przechowywanych w modelu i to stworzenie modelu Cię interesuje.



  • ok, zrobiłem dwie klasy dziedziczące po QTreeWidgetItem, ale nadal nie da się tego umieścić w liście.
    Oraz nie mogę stworzyć obiektów, a jedynie wskaźniki do nich.
    np.
    @produkt tyskie;@
    wywala błąd. poprawna wersja to:
    @produkt *tyskie;@

    Jak mam zrobić, żeby stworzone przeze mnie obiekty mogły być wyświetlane w tym drzewie? Dodam, że docelowo będzie QLista w QLiście czyli lista kategorii, w każdym obiekcie tej listy będzie lista subkategori i w każdym obiekcie z listy subkategorii będzie lista produktów.
    @
    kategoria1
    |->subkategoria1-> subkategoriaN->...
    -produkt1 -produkt1
    -produktN -produktN
    kategoria2
    |->subkategoria1-> subkategoriaN->...
    -produkt1 -produkt1
    -produktN -produktN@

    i chciałbym zrobić tak, że po naciśnięciu na 'subkategoria' w drzewie, w drugim okienku obok wyświetli się cała lista produktów, która będzie zawiarać się w obiekcie subkategoriaN .

    moje klasy:
    @#ifndef LISTAPRODUKTOW_H
    #define LISTAPRODUKTOW_H

    #include <QTreeWidgetItem>
    #include <QList>
    #include "produkt.h"

    class listaProduktow : public QTreeWidgetItem
    {
    Q_OBJECT

    public:
    QList<produkt> lista;
    void dodaj(produkt prod){ lista.append(prod);}
    explicit listaProduktow(QObject *parent = 0);

    signals:

    public slots:

    };

    #endif // LISTAPRODUKTOW_H@

    @#ifndef PRODUKT_H
    #define PRODUKT_H

    #include <QTreeWidgetItem>
    #include <QString>

    class produkt : public QTreeWidgetItem
    {
    Q_OBJECT
    public:
    QString nazwa;
    int cena;

    explicit produkt(QObject *parent = 0);
    

    signals:

    public slots:

    };

    #endif // PRODUKT_H@



  • Powinieneś zaprojektować własny model danych, dziedziczący po QAbstractItemModel, a następnie użyć go w swojej implementacji QTreeView / QTreeWidget. Poświęć chwilę na przeczytanie o klasie "QAbstractItemModel":http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html oraz o "ogólnych zasadach tworzenia architektury model/widok w Qt":qt-project.org/doc/qt-4.8/model-view-programming.html (szczególnie "ten podrozdział":http://qt-project.org/doc/qt-4.8/model-view-programming.html#model-subclassing-reference).

    Pojedyncze obiekty klasy QTreeWidgetItem lub jej subklasy są przydatne jeśli chcesz wykonywać samodzielnie operacje na drzewie (a raczej danych w jego modelu).


Log in to reply