Название: [РЕШЕНО] Странности QTreeView 
					Отправлено: Alexorleon от Июля 05, 2013,  13:01
					 
					Здравствуйте, выручайте плиз. Мне нужно реализовать дерево в QTreeView, для примера я собрал и запустил вот этот пример http://doc.qt.digia.com/4.7/itemview...treemodel.html, все замечательно работает. Я решил просто для эксперимента запустить этот же код из своего объекта и отобразить это же дерево в своем QTreeView. Для этого скопировал объявление и реализацию классов TreeItem и TreeModel к себе. В своем методе(не важно, например по нажатию кнопки), как и в main считываю файл с текстом в созданную TreeModel и назначаю эту модель в QTreeView с той лишь разницей, что у меня QTreeView уже создан в конструкторе.  … treeView = new QTreeView; … mainLayout->addWidget(treeView); … treeView->setModel(&model); // разница только в этом Все остальное тоже самое. Но в treeView ничего не выводится. Хотя другая тестовая модель выводится отлично(treeView работает), qdebug’ми проверял модель, все данные на месте(model работает). И что самое интересное отдельный проект же работает правильно. Разница только в глобальном QTreeView. Какие есть идеи и размышления? #include "querywizardwidget.h" #include <QStringList>
  QueryWizardWidget::QueryWizardWidget(QWidget *parent) :     QWidget(parent) {     rootCombo = new QComboBox;     rootModel = new ESqlQueryModel;     // отображение таблиц из комбобокса     queryModel = new ESqlQueryModel;
      treeView = new QTreeView;
      // --- main ---     QVBoxLayout *mainLayout = new QVBoxLayout;     mainLayout->addWidget(rootCombo);     mainLayout->addWidget(treeView);     setLayout(mainLayout);
      // --- init ---     updateData();     // выбор таблицы из комбобокса     connect(rootCombo,SIGNAL(currentIndexChanged(QString)),this,SLOT(slot(QString))); }
  //---------------- qww_TreeItem::qww_TreeItem(const QList<QVariant> &data, qww_TreeItem *parent) {     parentItem = parent;     itemData = data; }
  qww_TreeItem::~qww_TreeItem() {     qDeleteAll(childItems); }
  void qww_TreeItem::appendChild(qww_TreeItem *item) {     childItems.append(item); }
  qww_TreeItem *qww_TreeItem::child(int row) {     return childItems.value(row); }
  int qww_TreeItem::childCount() const {     return childItems.count(); }
  int qww_TreeItem::columnCount() const {     return itemData.count(); }
  QVariant qww_TreeItem::data(int column) const {     return itemData.value(column); }
  qww_TreeItem *qww_TreeItem::parent() {     return parentItem; }
  int qww_TreeItem::row() const {     if (parentItem)         return parentItem->childItems.indexOf(const_cast<qww_TreeItem*>(this));
      return 0; } //-------------- qww_TreeModel::qww_TreeModel(const QString &data, QObject *parent)     : QAbstractItemModel(parent) {     QList<QVariant> rootData;     //rootData << "Title" << "Summary";     rootItem = new qww_TreeItem(rootData);     setupModelData(data.split(QString("\n")), rootItem); }
  qww_TreeModel::~qww_TreeModel() {     delete rootItem; }
  int qww_TreeModel::columnCount(const QModelIndex &parent) const {     if (parent.isValid())         return static_cast<qww_TreeItem*>(parent.internalPointer())->columnCount();     else         return rootItem->columnCount(); }
  QVariant qww_TreeModel::data(const QModelIndex &index, int role) const {     if (!index.isValid())         return QVariant();
      if (role != Qt::DisplayRole)         return QVariant();
      qww_TreeItem *item = static_cast<qww_TreeItem*>(index.internalPointer());
      return item->data(index.column()); }
  Qt::ItemFlags qww_TreeModel::flags(const QModelIndex &index) const {     if (!index.isValid())         return 0;
      return Qt::ItemIsEnabled | Qt::ItemIsSelectable; }
  QVariant qww_TreeModel::headerData(int section, Qt::Orientation orientation,                                int role) const {     if (orientation == Qt::Horizontal && role == Qt::DisplayRole)         return rootItem->data(section);
      return QVariant(); }
  QModelIndex qww_TreeModel::index(int row, int column, const QModelIndex &parent) const {     if (!hasIndex(row, column, parent))         return QModelIndex();
      qww_TreeItem *parentItem;
      if (!parent.isValid())         parentItem = rootItem;     else         parentItem = static_cast<qww_TreeItem*>(parent.internalPointer());
      qww_TreeItem *childItem = parentItem->child(row);     if (childItem)         return createIndex(row, column, childItem);     else         return QModelIndex(); }
  QModelIndex qww_TreeModel::parent(const QModelIndex &index) const {     if (!index.isValid())         return QModelIndex();
      qww_TreeItem *childItem = static_cast<qww_TreeItem*>(index.internalPointer());     qww_TreeItem *parentItem = childItem->parent();
      if (parentItem == rootItem)         return QModelIndex();
      return createIndex(parentItem->row(), 0, parentItem); }
  int qww_TreeModel::rowCount(const QModelIndex &parent) const {     qww_TreeItem *parentItem;     if (parent.column() > 0)         return 0;
      if (!parent.isValid())         parentItem = rootItem;     else         parentItem = static_cast<qww_TreeItem*>(parent.internalPointer());
      return parentItem->childCount(); }
  void qww_TreeModel::setupModelData(const QStringList &lines, qww_TreeItem *parent) {     QList<qww_TreeItem*> parents;     QList<int> indentations;     parents << parent;     indentations << 0;
      int number = 0;
      while (number < lines.count()) {         int position = 0;         while (position < lines[number].length()) {             if (lines[number].mid(position, 1) != " ")                 break;             position++;         }
          QString lineData = lines[number].mid(position).trimmed();
          if (!lineData.isEmpty()) {             // Read the column data from the rest of the line.             QStringList columnStrings = lineData.split("\t", QString::SkipEmptyParts);             QList<QVariant> columnData;             for (int column = 0; column < columnStrings.count(); ++column)                 columnData << columnStrings[column];
              if (position > indentations.last()) {                 // The last child of the current parent is now the new parent                 // unless the current parent has no children.
                  if (parents.last()->childCount() > 0) {                     parents << parents.last()->child(parents.last()->childCount()-1);                     indentations << position;                 }             } else {                 while (position < indentations.last() && parents.count() > 0) {                     parents.pop_back();                     indentations.pop_back();                 }             }
              // Append a new item to the current parent's list of children.             parents.last()->appendChild(new qww_TreeItem(columnData, parents.last()));         }
          number++;     } }
  void QueryWizardWidget::slot(QString str){
      QFile file(":/default.txt");     file.open(QIODevice::ReadOnly);     qww_TreeModel model(file.readAll());     file.close();
      treeView->setModel(&model); }
  void QueryWizardWidget::updateData() {     rootModel->setQuery("SELECT schemaname||'.'||tablename AS tdesc"                         " FROM pg_tables"                         " WHERE NOT(tableowner='postgres')"                         " ORDER BY tdesc ASC;");
      rootCombo->setModel(rootModel);     rootCombo->setModelColumn(0); }
  Хедеры без изменений.  
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: VPS от Июля 05, 2013,  13:09
					 
					Исходник с не рабочим примером не помешал бы... 
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: Alexorleon от Июля 05, 2013,  15:10
					 
					Исходник с не рабочим примером не помешал бы...
  По сигналу вызывается "slot", в нем по сути аналог "main" из примера Simple Tree Model Example. Разница только в вызове treeView. Модель я проверял через QModelIndex index = model->index(0,0); QString text = index.data(Qt::DisplayRole).toString(); - данные на месте.  
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: Bepec от Июля 05, 2013,  15:34
					 
					"Аналог" "похоже" "возможно" "наверно". Код выкладывайте и не насилуйте телепатию наших знатоков. 
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: Alexorleon от Июля 05, 2013,  15:42
					 
					"Аналог" "похоже" "возможно" "наверно". Код выкладывайте и не насилуйте телепатию наших знатоков.
  Смысл тот же код выкладывать, я 99% брал здесь http://doc.qt.digia.com/4.7/itemviews-simpletreemodel.html. Все что поменял, в коде выше. Поменял только вызов treeView.  
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: VPS от Июля 05, 2013,  15:48
					 
					уберите, для начала, комментарий вот здесь: qww_TreeModel::qww_TreeModel(const QString &data, QObject *parent)     : QAbstractItemModel(parent) {     QList<QVariant> rootData;     //rootData << "Title" << "Summary";     rootItem = new qww_TreeItem(rootData);     setupModelData(data.split(QString("\n")), rootItem); }
   
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: Alexorleon от Июля 05, 2013,  16:04
					 
					уберите, для начала, комментарий вот здесь:
  да-да, он убран, извиняюсь. Забыл здесь просто убрать. Вот еще пища для размышлений. Код в примере в main:  QFile file(":/default.txt");  file.open(QIODevice::ReadOnly);  TreeModel model(file.readAll());  file.close();  QTreeView view;  view.setModel(&model);  view.setWindowTitle(QObject::tr("Simple Tree Model"));  view.show(); у меня в методе:  QFile file(":/default.txt");  file.open(QIODevice::ReadOnly);  TreeModel model(file.readAll());  file.close();  treeView->setModel(&model); Вот и всё различие. Магия блин =)  
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: Bepec от Июля 05, 2013,  16:07
					 
					Это называется, простите меня великодушно, пожалуйста. И ещё раз простите - вы просто вынуждаете меня написать это слово - *алпаепизм. Вместо выкладывания кода с ошибкой вы просите помощи, но ничего не даёте. 
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: kambala от Июля 05, 2013,  16:12
					 
					у тебя в методе модель является локальной переменной, поэтому она умирает по выходе из метода 
					 
					 
					Название: Re: Странности QTreeView 
					Отправлено: Alexorleon от Июля 06, 2013,  13:33
					 
					у тебя в методе модель является локальной переменной, поэтому она умирает по выходе из метода
  Просто чистой воды магия. 2 раза создавал модель глобально. И в методе и прям в конструкторе. Но на третий раз все заработало. Kambala, спасибо что заставили еще раз попробовать. В итоге в чем была причина я так и не понял, добро пожаловать в реальный мир =) Спасибо всем что откликнулись на помощь.  
					
  
					
				 |