Добрый день.
Хочу добиться эффекта, что бы при открытии 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.: Вопрос не по теме.. Подскажите, а как ставить для темы статус - РЕШЕНО? или это только могут модераторы делать?