Russian Qt Forum
Сентябрь 30, 2024, 02:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическая работа с QTreeWidget  (Прочитано 3868 раз)
carhun
Гость
« : Май 17, 2012, 11:53 »

Добрый день.

Хочу добиться эффекта, что бы при открытии QTreeWidgetItem ( пункт меню будем считать ) появлялся некий виджит с достаточно большим к-ом данных, и соотв. при закрытии он исчезал. На данный момент делают след. образом и не могу понять почему оно падает, когда я открыл, потом закрыл, а потом пробую опять открыть оно падает:

Код:
#ifndef GRAPHICWIDGET_H
#define GRAPHICWIDGET_H

#include <QWidget>

class QTreeWidgetItem;
class QTreeWidget;
class QComboBox;

class GraphicWidget : public QWidget
{
    Q_OBJECT
public:
    explicit GraphicWidget(QWidget *parent = 0);
   
private:
    QTreeWidget     *tree;
    QTreeWidgetItem *childNew;
    QComboBox       *box;
signals:
   
public slots:
    void itemCollapsed(QTreeWidgetItem *item);
    void itemExpanded(QTreeWidgetItem *item);
};

#endif // GRAPHICWIDGET_H

Код:
#include "graphicwidget.h"

#include <QVBoxLayout>
#include <QTreeWidget>
#include <QHeaderView>
#include <QComboBox>

#include "graphicplot.h"

GraphicWidget::GraphicWidget(QWidget *parent) : QWidget(parent) {
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    tree = new QTreeWidget(this);
    QList<QTreeWidgetItem *> items;

    tree->header()->hide();
    tree->setColumnCount(2);

    QTreeWidgetItem *top = new QTreeWidgetItem();
    top->setText(0, "TOP");

    childNew = new QTreeWidgetItem();
    childNew->setText(0, "");
    childNew->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);

    top->addChild(childNew);

    items.push_back(top);

    tree->setHeaderLabel("GUI");
    tree->addTopLevelItems(items);

    tree->setItemWidget(childNew, 1, 0);

    mainLayout->addWidget(tree);
    setLayout(mainLayout);

    box = new QComboBox();

    connect(tree, SIGNAL(itemCollapsed(QTreeWidgetItem*)), this, SLOT(itemCollapsed(QTreeWidgetItem*)));
    connect(tree, SIGNAL(itemExpanded(QTreeWidgetItem*)), this, SLOT(itemExpanded(QTreeWidgetItem*)));
}

void GraphicWidget::itemCollapsed(QTreeWidgetItem *item)
{
    if (item == childNew) {
        qDebug() << "GraphicWidget::itemCollapsed";
        tree->setItemWidget(childNew, 1, 0);
    }
}

void GraphicWidget::itemExpanded(QTreeWidgetItem *item)
{
    if (item == childNew) {
        qDebug() << "GraphicWidget::itemExpanded";
        tree->setItemWidget(childNew, 1, box);
    }
}

И теперь ряд вопросов:
1. почему оно падает? Если каждый раз делать new QComboBox заместь того, что бы пихать где-то там созданный box, то все ок. Но просто в моем случаи этот QComboBox будет хранить большой к-во данных и каждый раз перед  tree->setItemWidget(...); создавать новый QComboBox и копировать туда данные для отображения будет долго...
Если так вообще делать не хорошо, то заодно если не тяжело поясните как делать хорошо?
2. У меня данный GraphicWidget планируется, что будет досаточно большой, я иммею ввиду будет много QTreeWidgetitem'ов и в связи с этим вопрос как с этим бороться, что бы не делать много подобного кода вида:
Код:
    QTreeWidgetItem *top = new QTreeWidgetItem();
    top->setText(0, "TOP");

    childNew = new QTreeWidgetItem();
    childNew->setText(0, "");
    childNew->setChildIndicatorPolicy(QTreeWidgetItem::ShowIndicator);

    top->addChild(childNew);

Вроде как все.

Спасибо за внимание!

P.S.:  Вопрос не по теме.. Подскажите, а как ставить для темы статус - РЕШЕНО? или это только могут модераторы делать?

Записан
DmitryM
Гость
« Ответ #1 : Май 17, 2012, 12:10 »

1. очевидно что объект удаляется.
что бы заново не записывать данные используй setModel()

2.писать структурированный код с процедурами и функциями.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.