Problem z utworzeniem klasy i metoda z QTreeWidget

0

Witam.
Utworzyłem sobie oto taką prostą klasę, która dziedziczy po QTreeWidgetItem
CustomQTreeWidgetItem.h

 #ifndef CUSTOMQTREEWIDGETITEM_H
#define CUSTOMQTREEWIDGETITEM_H

#include <QTreeWidgetItem>
#include <QKeySequence>
//
// This class create QTreeWidgetItem with a specific name,path,icon,etc.
//
class CustomQTreeWidgetItem : public QTreeWidgetItem
{
public:
    CustomQTreeWidgetItem(QTreeWidgetItem *ItemTreetypeItem, QString ItemName=0, QString ItemPath=0, bool ItemIsCard=false, bool ItemRunAsAdmin=false, QString ItemIcon=0, QKeySequence ItemShortcut = 0);
    virtual ~CustomQTreeWidgetItem();
    void setCard(bool isACard);
    void setName(QString ItemName);
    void setIcon(QString ItemIcon);
    void setPath(QString ItemPath);
    void setRunAsAdmin(bool RunPathAsAdmin);
    void setShortcut(QKeySequence ItemShortcut);

protected:
    bool isCard;
    QString Name;
    QString Icon;
    QString Path;
    bool RunAsAdmin;
    QKeySequence ShortCut;
    QTreeWidgetItem *TreetypeItem;

};

#endif // CUSTOMQTREEWIDGETITEM_H

CustomQTreeWidgetItem.cpp

 #include "customqtreewidgetitem.h"

CustomQTreeWidgetItem::CustomQTreeWidgetItem(QTreeWidgetItem *ItemTreetypeItem, QString ItemName, QString ItemPath, bool ItemIsCard, bool ItemRunAsAdmin, QString ItemIcon, QKeySequence ItemShortcut)
     : TreetypeItem(ItemTreetypeItem),isCard(ItemIsCard),Name(ItemName),Icon(ItemIcon),Path(ItemPath),RunAsAdmin(ItemRunAsAdmin),ShortCut(ItemShortcut)
{

}

CustomQTreeWidgetItem::~CustomQTreeWidgetItem()
{

}

void CustomQTreeWidgetItem::setCard(bool isACard)
{
    isCard=isACard;
}

void CustomQTreeWidgetItem::setName(QString ItemName)
{
    Name=ItemName;
}

void CustomQTreeWidgetItem::setIcon(QString ItemIcon)
{
    Icon=ItemIcon;
}

void CustomQTreeWidgetItem::setPath(QString ItemPath)
{
    Path=ItemPath;
}

void CustomQTreeWidgetItem::setRunAsAdmin(bool RunPathAsAdmin)
{
    RunAsAdmin=RunPathAsAdmin;
}

void CustomQTreeWidgetItem::setShortcut(QKeySequence ItemShortcut)
{
    ShortCut=ItemShortcut;
}

Tworzę obiekt w taki sposób:

 CustomQTreeWidgetItem *item = new CustomQTreeWidgetItem(dziecko,Nazwa,0,true);
    item->setCard(true);//nowy utworzony atrybut dla itemku
    item->setText(0,Nazwa);

Lecz mam problem, bo chcę sprawdzić właściwość z danego itemu z QTreeWidget.

     QTreeWidgetItem *dziecko;
    QTreeWidget TreeWidget;
    CustomQTreeWidgetItem *item = new CustomQTreeWidgetItem(dziecko,Nazwa,0,true);
    item->setCard(true);//nowy utworzony atrybut dla itemku
    item->setText(0,Nazwa);
    
    if(TreeWidget.currentItem()->isCard==true)//nie ma w currentitem() isCard #################Problem#############
    {
        //costam
    }

Tak naprawdę to nie mam pojęcia co robić aby "bool isCard" był widoczny dla metody currentitem() z klasy QTreeWidget. Ktoś by mógł mnie nakierować jak to zrobić ? Muszę napisać nową klasę, która dziedzczy QTreeWidget i jakoś dopisać to do metody currentitem() ?

0

Nie patrzę w dokumentację teraz ale na 99% currentItem() zwraca QTreeWidgetItem, które nie ma metody isCard(). Musiałbyś rzutować obiekt ale zanim to zrobisz to napisz co chcesz osiągnąć i po co Ci dziedziczenie i nowa metoda. Może to co chcesz uzyskać da się zrobić inaczej ale trudno doradzić bez dodatkowej wiedzy.

Tak poza tym kod jest niekompletny - dziecko jest niezdefiniowane(brak new czy choćby przypisania do NULL), poza tym isCard jest protected, więc niedostępne - trzeba zrobić publicznego gettera, bo settery porobiłeś.

0

OK. Poprawiłem kod:
customqtreeitem.h

 
#ifndef CUSTOMQTREEWIDGETITEM_H
#define CUSTOMQTREEWIDGETITEM_H

#include <QTreeWidgetItem>
#include <QTreeWidget>
#include <QKeySequence>
//
// This class create QTreeWidgetItem with a specific name,path,icon,etc.
//
class CustomQTreeWidgetItem : public QTreeWidgetItem
{
public:
    CustomQTreeWidgetItem(QTreeWidgetItem *ItemTreetypeItem, QString ItemName=0, QString ItemPath=0, bool ItemIsCard=false, bool ItemRunAsAdmin=false, QString ItemIcon=0, QKeySequence ItemShortcut = 0);
    CustomQTreeWidgetItem(QTreeWidget *ItemTreetype, QString ItemName=0, bool ItemIsCard=0, bool ItemRunAsAdmin=0, QString ItemIcon=0);

    CustomQTreeWidgetItem();
    virtual ~CustomQTreeWidgetItem();

    //set
    void setCard(bool isACard);
    void setName(QString ItemName);
    void setIcon(QString ItemIcon);
    void setPath(QString ItemPath);
    void setRunAsAdmin(bool RunPathAsAdmin);
    void setShortcut(QKeySequence ItemShortcut);

    //get
    bool isCard();
    bool getRunAsAdmin();
    QString getName();
    QString getIcon();
    QString getPath();
    QKeySequence getShortcut();

private:
    bool Card;
    bool RunAsAdmin;
    QString Name;
    QString Icon;
    QString Path;
    QKeySequence ShortCut;
    QTreeWidgetItem *TreetypeItem;
    QTreeWidget *Treetype;
};

#endif // CUSTOMQTREEWIDGETITEM_H

customqtreeitem.cpp

 
#include "customqtreewidgetitem.h"

CustomQTreeWidgetItem::CustomQTreeWidgetItem(QTreeWidgetItem *ItemTreetypeItem, QString ItemName, QString ItemPath, bool ItemIsCard, bool ItemRunAsAdmin, QString ItemIcon, QKeySequence ItemShortcut)
     : TreetypeItem(ItemTreetypeItem),Card(ItemIsCard),Name(ItemName),Icon(ItemIcon),Path(ItemPath),RunAsAdmin(ItemRunAsAdmin),ShortCut(ItemShortcut)
{

}
CustomQTreeWidgetItem::CustomQTreeWidgetItem(QTreeWidget *ItemTreetype, QString ItemName, bool ItemIsCard, bool ItemRunAsAdmin, QString ItemIcon)
    : Treetype(ItemTreetype),Card(ItemIsCard),Name(ItemName),Icon(ItemIcon),RunAsAdmin(ItemRunAsAdmin)
{

}
CustomQTreeWidgetItem::CustomQTreeWidgetItem()
{

}

CustomQTreeWidgetItem::~CustomQTreeWidgetItem()
{

}

void CustomQTreeWidgetItem::setCard(bool isACard)
{
    Card=isACard;
}

void CustomQTreeWidgetItem::setName(QString ItemName)
{
    Name=ItemName;
}

void CustomQTreeWidgetItem::setIcon(QString ItemIcon)
{
    Icon=ItemIcon;
}

void CustomQTreeWidgetItem::setPath(QString ItemPath)
{
    Path=ItemPath;
}

void CustomQTreeWidgetItem::setRunAsAdmin(bool RunPathAsAdmin)
{
    RunAsAdmin=RunPathAsAdmin;
}

void CustomQTreeWidgetItem::setShortcut(QKeySequence ItemShortcut)
{
    ShortCut=ItemShortcut;
}

bool CustomQTreeWidgetItem::isCard()
{
    return Card;
}

QString CustomQTreeWidgetItem::getName()
{
    return Name;
}

QString CustomQTreeWidgetItem::getIcon()
{
    return Icon;
}

QString CustomQTreeWidgetItem::getPath()
{
    return Path;
}

bool CustomQTreeWidgetItem::getRunAsAdmin()
{
    return RunAsAdmin;
}

QKeySequence CustomQTreeWidgetItem::getShortcut()
{
    return ShortCut;
}

Chciałbym użyć tej klasy tak:

void MainWindow::DodajGrupe(QTreeWidget *TreeWidget, QString Nazwa)
{
    CustomQTreeWidgetItem *item = new CustomQTreeWidgetItem(TreeWidget);
    // tak jak powyzej lub
    // CustomQTreeWidgetItem *item = new CustomQTreeWidgetItem(TreeWidget,Nazwa);
    // item->setCard(false); //taka wlasciwosc karty, dodane przeze mnie
    item->setCard(false);
    item->setText(0,Nazwa);

    //sprawdzenie czy zaznaczony item z TreeWidget to nie przypadkiem karta
    if(TreeWidget->currentItem()->isCard==true) // ############ PROBLEM ################
    {
        //dodaj karte
        TreeWidget->currentItem()->addChild(item);
    }
    else
    {
        //wywal blad ze  nie moze dodac grupy do karty
    }
}
void MainWindow::DodajKarte(QTreeWidgetItem *dziecko, QString Nazwa, QTreeWidget TreeWidget)
{
    CustomQTreeWidgetItem *item = new CustomQTreeWidgetItem();
    item->setText(0,Nazwa);
    item->setCard(true);
    if(TreeWidget.currentItem()->isCard==true) // ############ PROBLEM ################
    {
        //dodaj karte(dziecko) do grupy
        dziecko->addChild(item);
    }
    else
    {
        //wywal blad, ze nie mozna dodac karty do karty
        //powinien byc zaznaczony item grupy, a nie karta
    }
}
 

Po prostu currentItem() musi mi zwrócić, czy zaznaczony item z TreeWidget jest kartą(true) czy grupą(false). Bo po prostu życzę sobie, żeby w programie nie można było dodać karty do karty(drzewko), tylko karty do grupy(za pomocą przycisków w interfejsie, np.: dodaj grupę, dodaj kartę).
Coś takiego:

Grupa A
|-Grupa B
| |-Grupa C
| | |-Karta 1
| | |-Karta 2
| |
| |-Grupa D
|  |-Karta 1
|  |-Karta 400
|
|-Grupa E

Dlatego więc zrobiłem klasy, bo każdy (QTreeWidgeItem) item z tego QTreeWidget posiada własne tak jakby dane: nazwę, ścieżkę do ikony, czy jest kartą, czy też grupą.

1

W takim przypadku można zrobić to np:

CustomQTreeWidgetItem* testCurrentItem = dynamic_cast< CustomQTreeWidgetItem* > ( TreeWidget.currentItem() ); // robimy dynamic cast - jeśli to obiekt typu CustomQTreeWidgetItem to mamy wskaźnik, jeśli nie to mamy NULL
if( testCurrentItem )
{
      // testowanie na isCard i inne
}
1

możesz też wykorzystać QTreeWidgetItem::ItemType :

class MainWindow : public QMainWindow
{
        Q_OBJECT
    enum ItemType {
                    Leaf = QTreeWidgetItem::UserType + 1,
                    Branch = QTreeWidgetItem::UserType + 2
                  };

    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
        
    private:
        Ui::MainWindow *ui;
        bool AddItem(ItemType type);
        uint branchCounter;
        uint leafCounter;

    private slots:
        void _slAddLeaf();
        void _slAddBranch();
};
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow), branchCounter(0), leafCounter(0)
{
    ui->setupUi(this);
    ui->btnLeaf->setText("leaf");
    ui->btnBranch->setText("branch");
    QTreeWidgetItem *root = new QTreeWidgetItem(Branch);
    root->setText(0, "Branch0");
    ui->treeWidget->insertTopLevelItem(0, root);

    ++branchCounter;

    connect(ui->btnLeaf, SIGNAL(clicked()), this, SLOT(_slAddLeaf()));
    connect(ui->btnBranch, SIGNAL(clicked()), this, SLOT(_slAddBranch()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::AddItem(ItemType type)
{
    QTreeWidgetItem *item = new QTreeWidgetItem(type);
    QTreeWidgetItem *currentItem = ui->treeWidget->currentItem();

    QString text((type == Branch) ? "Branch" + QString::number(branchCounter)
                                 : "Leaf" + QString::number(leafCounter));
    item->setText(0, text);

    if(currentItem && currentItem->type() == Branch)
    {
        currentItem->addChild(item);
        return true;
    }

    return false;
}

void MainWindow::_slAddLeaf()
{
    if(AddItem(Leaf)) ++leafCounter;
}

void MainWindow::_slAddBranch()
{
    if(AddItem(Branch)) ++branchCounter;
}

ui oczywiście : QTreeWidget + 2x QPushButton

Oczywiście, że jest to tylko alternatywa dla tego całego isCard.

0

Dzięki wielkie za rozwiązania. Wybiorę najlepszą dla mnie:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1