Название: [РЕШЕНО] Странности 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, спасибо что заставили еще раз попробовать. В итоге в чем была причина я так и не понял, добро пожаловать в реальный мир =) Спасибо всем что откликнулись на помощь.
|