crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 5:48