crossplatform.ru

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


  Ответ в Проблема с наследованием QAbstractItemModel
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 13.4.2011, 17:18
 
Цитата(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 забыл)
abc Дата 13.4.2011, 15:22
  Се ля ви :)
fedak_denis Дата 13.4.2011, 15:10
 
Цитата(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, 14:45
 
Цитата(fedak_denis @ 13.4.2011, 14:19) *
QuestionsModel questionsModel;

нужно через new, по выходе из области видимости твоя модель удаляется
если хочешь без new, то нужно модель делать членом класса
fedak_denis Дата 13.4.2011, 13:36
 
Цитата(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) )

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

А переданный невалидный индекс в columnCount() и rowCount означает что запрашиваются размеры для корневого элемента. не надо там 0 возвращать
fedak_denis Дата 13.4.2011, 13:19
 
Цитата(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);
xls Дата 13.4.2011, 13:13
  Похоже, ты не задал модель вьюшке или приведи весь код.
fedak_denis Дата 13.4.2011, 12:21
  Всем привет! Проблема в следующем. Наследую 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) )
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 8:20