crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблема с наследованием QAbstractItemModel, Вызвается только columnCount() а дальше все...
fedak_denis
  опции профиля:
сообщение 13.4.2011, 12:21
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 13.4.2011
Пользователь №: 2597

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет! Проблема в следующем. Наследую QAbstractItemModel. Все необходимые методы переопределил. Ни варнингов ни эрроров никаких нет. Но вьюшка пуста.
В начало каждого метода модели вставил qDebug()<<(имя метода), но в консоли приложения получаю лишь следующее:

konstruktor
setRootNode
columnCount
columnCount
columnCount


ок в columnCount(const QModelIndex &parent) дописал еще ниже qDebug()<<parent, теперь:

konstruktor
setRootNode
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )


Ладно, пусть туда передаются недействительные индексы, но другие методы то почему не вызываются?

дописал проверку на действительность индекса.
int QuestionsModel::columnCount(const QModelIndex &parent) const
{
    qDebug()<<"columnCount";
    qDebug()<<parent;
    if(!parent.isValid())
        return 0;
    return 1;
}


теперь columnCount только 2 раза запускается

konstruktor
setRootNode
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xls
  опции профиля:
сообщение 13.4.2011, 13:13
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 44
Регистрация: 6.9.2010
Пользователь №: 2013

Спасибо сказали: 7 раз(а)




Репутация:   2  


Похоже, ты не задал модель вьюшке или приведи весь код.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fedak_denis
  опции профиля:
сообщение 13.4.2011, 13:19
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 13.4.2011
Пользователь №: 2597

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(xls @ 13.4.2011, 16:13) *
Похоже, ты не задал модель вьюшке или приведи весь код.

Нет модель с вьюшкой связываю. Ок, щас код кину.
#include "questionsmodel.h"

#include <QDebug>

QuestionsModel::QuestionsModel(QObject *parent) :
    QAbstractItemModel(parent)
{
    qDebug()<<"konstruktor";
}

Qt::ItemFlags QuestionsModel::flags(const QModelIndex &index) const
{
    qDebug()<<"flags()";
    return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
}

QVariant QuestionsModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    qDebug()<<"headerData()";
    if(orientation == Qt::Horizontal && role == Qt::DisplayPropertyRole){
        QVariant("Plugins");
    }
    return QVariant();
}

QVariant QuestionsModel::data(const QModelIndex &index, int role) const
{
    qDebug()<<"data";
    if(role!=Qt::DisplayRole)
        return QVariant();
    Node * node = nodeFromIndex(index);
    if (!node)
        return QVariant();
    return QVariant(node->getString());
}

Node * QuestionsModel::nodeFromIndex(const QModelIndex &index) const
{
    qDebug()<<"                    nodeFromIndex";
    if(index.isValid())
        return static_cast<Node *>(index.internalPointer());
    else
        return rootNode;
}

QModelIndex QuestionsModel::index(int row, int column, const QModelIndex &parent) const
{
    qDebug("rtyjfykkgkhgkgkg");

    if (!hasIndex(row, column, parent))
        return QModelIndex();

    Node * parentNode = nodeFromIndex(parent);

    if(parentNode == rootNode)
        return QModelIndex();

    return createIndex(row,column,parentNode->children[row]);
}

QModelIndex QuestionsModel::parent(const QModelIndex &child) const
{
    qDebug()<<"parent";
    Node * node = nodeFromIndex(child);
    if(!node || node == rootNode)
        return QModelIndex();

    Node * parentNode = node->parent;

    if(!parentNode || node == rootNode)
        return QModelIndex();

//    Node * grandparentNode = parentNode->parent;

    int row = parentNode->children.indexOf(parentNode);

//    if(!grandparentNode)
//        row = grandparentNode->children.indexOf(parentNode);
//    else
//        row = FNodeList.indexOf(parentNode);
    return createIndex(row,child.column(),parentNode);
}

void QuestionsModel::setPluginList(QList<IPlugin *> plugins)
{
    qDebug()<<"setRootNode";
    QMap<QString,QList<IPlugin *> > pluginTree;
    foreach(IPlugin * plugin,plugins){
        QString testString = plugin->getStringDiscipline()+
                             QString::number(plugin->getNumber());
        pluginTree[testString].append(plugin);
    }
    rootNode = new RootNode();

    foreach(QList<IPlugin *> pluginList,pluginTree){
        TestNode * testNode = new TestNode();
        foreach(IPlugin * testPlugin,pluginList){
            PluginNode * pluginNode = new PluginNode(testPlugin);
            testNode->children.append(pluginNode);
            pluginNode->parent = testNode;
        }
        rootNode->children.append(testNode);
    }
    reset();
}

int QuestionsModel::rowCount(const QModelIndex &parent) const
{
    qDebug()<<"rowCount";
    Node * parentNode = nodeFromIndex(parent);
    if (!parentNode)
        return 0;
    return parentNode->children.count();
}

int QuestionsModel::columnCount(const QModelIndex &parent) const
{
    qDebug()<<"columnCount";
    qDebug()<<parent;
    if(!parent.isValid())
        return 0;
    return 1;
}



а вот связка тривьюшки с моделью.

    QuestionsModel questionsModel;
    questionsModel.setPluginList(pluginList);
    ui->treeView->setModel(&questionsModel);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_mutineer_*
сообщение 13.4.2011, 13:26
Сообщение #4





Гости








    


У тебя вью спрашивает сколько колонок надо отобразить, ты ему отвечаешь что 0. Раз колонок нет, то данные отображать не надо. Раз отображать не надо, значит и спрашивать их не надо. Попробуй всегда возвращать 1 из columnCount()

А переданный невалидный индекс в columnCount() и rowCount означает что запрашиваются размеры для корневого элемента. не надо там 0 возвращать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fedak_denis
  опции профиля:
сообщение 13.4.2011, 13:36
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 13.4.2011
Пользователь №: 2597

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(mutineer @ 13.4.2011, 16:26) *
А переданный невалидный индекс в columnCount() и rowCount означает что запрашиваются размеры для корневого элемента. не надо там 0 возвращать


Так то да, логично, исправил.

int QuestionsModel::rowCount(const QModelIndex &parent) const
{
    qDebug()<<"rowCount";
    Node * parentNode = nodeFromIndex(parent);
    return parentNode->children.count();
}

int QuestionsModel::columnCount(const QModelIndex &parent) const
{
    qDebug()<<"columnCount";
    qDebug()<<parent;
    return 1;
}


но вьюшка попрежнему пуста и в консоли
konstruktor
setRootNode
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )
columnCount
QModelIndex(-1,-1,0x0,QObject(0x0) )

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 13.4.2011, 14:45
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


Цитата(fedak_denis @ 13.4.2011, 14:19) *
QuestionsModel questionsModel;

нужно через new, по выходе из области видимости твоя модель удаляется
если хочешь без new, то нужно модель делать членом класса
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fedak_denis
  опции профиля:
сообщение 13.4.2011, 15:10
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 13.4.2011
Пользователь №: 2597

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(abc @ 13.4.2011, 17:45) *
Цитата(fedak_denis @ 13.4.2011, 14:19) *
QuestionsModel questionsModel;

нужно через new, по выходе из области видимости твоя модель удаляется
если хочешь без new, то нужно модель делать членом класса


Точно, оно самое :lol: . Большое спасибо. Вторые сутки мучаюсь. Конечно косяки остались - дерево не отображется, но это уже наверно index и parent отлаживать надо.
У меня была мысль об этом, но я думал в конструкторе MainWindow объявил там и юзаю свободно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 13.4.2011, 15:22
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


Се ля ви :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.4.2011, 17:18
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(fedak_denis @ 13.4.2011, 16:19) *
QVariant QuestionsModel::headerData(int section, Qt::Orientation orientation, int role) const
{
qDebug()<<"headerData()";
if(orientation == Qt::Horizontal && role == Qt::DisplayPropertyRole){
QVariant("Plugins");
ты тут ничего не возвращаешь (слово return забыл)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.10.2019, 1:35