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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Странности QTreeView  (Прочитано 7221 раз)
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);
}

Хедеры без изменений.
« Последнее редактирование: Июль 06, 2013, 13:34 от Alexorleon » Записан
VPS
Гость
« Ответ #1 : Июль 05, 2013, 13:09 »

Исходник с не рабочим примером не помешал бы...
Записан
Alexorleon
Гость
« Ответ #2 : Июль 05, 2013, 15:10 »

Исходник с не рабочим примером не помешал бы...

По сигналу вызывается "slot", в нем по сути аналог "main" из примера Simple Tree Model Example. Разница только в вызове treeView. Модель я проверял через QModelIndex index = model->index(0,0);
QString text = index.data(Qt::DisplayRole).toString(); - данные на месте.
Записан
Bepec
Гость
« Ответ #3 : Июль 05, 2013, 15:34 »

"Аналог" "похоже" "возможно" "наверно". Код выкладывайте и не насилуйте телепатию наших знатоков.
Записан
Alexorleon
Гость
« Ответ #4 : Июль 05, 2013, 15:42 »

"Аналог" "похоже" "возможно" "наверно". Код выкладывайте и не насилуйте телепатию наших знатоков.


Смысл тот же код выкладывать, я 99% брал здесь http://doc.qt.digia.com/4.7/itemviews-simpletreemodel.html. Все что поменял, в коде выше. Поменял только вызов treeView.
Записан
VPS
Гость
« Ответ #5 : Июль 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);
}
« Последнее редактирование: Июль 05, 2013, 15:52 от vps » Записан
Alexorleon
Гость
« Ответ #6 : Июль 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);

Вот и всё различие. Магия блин =)
Записан
Bepec
Гость
« Ответ #7 : Июль 05, 2013, 16:07 »

Это называется, простите меня великодушно, пожалуйста. И ещё раз простите - вы просто вынуждаете меня написать это слово - *алпаепизм. Вместо выкладывания кода с ошибкой вы просите помощи, но ничего не даёте.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #8 : Июль 05, 2013, 16:12 »

у тебя в методе модель является локальной переменной, поэтому она умирает по выходе из метода
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Alexorleon
Гость
« Ответ #9 : Июль 06, 2013, 13:33 »

у тебя в методе модель является локальной переменной, поэтому она умирает по выходе из метода

Просто чистой воды магия. 2 раза создавал модель глобально. И в методе и прям в конструкторе. Но на третий раз все заработало. Kambala, спасибо что заставили еще раз попробовать.
В итоге в чем была причина я так и не понял, добро пожаловать в реальный мир =)

Спасибо всем что откликнулись на помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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