crossplatform.ru

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

> Не отображается rootNode при создании класс от QAbstractItemModel
Delphist
  опции профиля:
сообщение 11.8.2008, 9:24
Сообщение #1


Студент
*

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

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




Репутация:   0  


Возникла следующая проблема. У меня есть класс вида:
CMyClass
{
public:
    
    CMyClass();

    inline QString getName() const {return m_sName;}
                inline CMyClass *getParent() {return m_pOwner;}
    inline CMyClass& operator[](QString sKey) {return getProperty(sKey);}

                ...
    
private:
    CMyClass& getProperty(QString sKey);
    QHash<QString,CMyClass*> m_Properties;
    
    QString           m_sName;
    CMyClass      *m_pOwner;
};


по сути это класс иерархической структуры, поэтому для его наглядного изображения я использовал принцип модель-представления,
в качестве представления я использую TreeView в качестве модели свой класс наследованный от QAbstractItemModel.
Проблема следующая, когда у меня дерево вида:
Obj1 (rootNode)
|
|__Child1
| |
| |__Child11
|
|__Child2

то моя модель не отобраэает rootNode, а отображает вот так, в чем может быть проблема.
|__Child1
| |
| |__Child11
|
|__Child2

1. Из-за чего может возникать такая проблема?
2. Может у кого есть, примеры реализации отображения деревьем использующие в качестве контейнера QHash(QString, SameClass*)?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 15.8.2008, 19:00
Сообщение #2


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

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

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




Репутация:   94  


вообщем как бы я начал делать твою прогу.
Сделал бы интерфейс, который компилится, но несодержит модели и следовательно данные.
1) Главный файл не содержит ничего лишнего, только стандартный набор (обычно его засовывают в клас унаследованый от QApplication, но пока так) + главный виджет программы
1.1) файл main.cpp
/*!
\file main.cpp
\brief Основной файл программы.
*/

#include <QApplication>
#include <QStyle>
#include <QStyleFactory>
#include <QTextCodec>
#include <QLocale>
#include <QTranslator>
#include <QDir>

#include "mymonitor.h"

int main(int argc, char *argv[])
{
//    Q_INIT_RESOURCE(mdi);

  QDir            dir_plugin;    // каталог плагинов
  QStyle        *pStyle;    // стиль ПО
  QString        locale;        // язык локали
  QTranslator    *qttr;        // переводчик программы
  QStringList     list_path;    // Список путей
  
    QApplication app(argc, argv);
    
    // Устанавливаем кодеки
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));// без этой кодировки с БД проблема
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); // Для функций перевода tr()
    
    // Устанавливаем свойства программы (понадобится для настроек)
    QCoreApplication::setOrganizationName(QObject::tr("ЗАО \"Тест\""));
    QCoreApplication::setApplicationName(QObject::tr("Тест модель"));
    
    // устанавливаем путь к плагинам (добавим каталог бинаря)
    dir_plugin = QDir(qApp->applicationDirPath()+"/plugins/");
    list_path << dir_plugin.absolutePath() << app.libraryPaths ();
    app.setLibraryPaths(list_path);
    
    // Устанавливаем стили
    pStyle = QStyleFactory::create("Plastique");//Cleanlooks Plastique windows windowsxp
    QApplication::setStyle(pStyle);
    app.setPalette(pStyle->standardPalette());
    
    // Устанавливаем превод библиотек Qt
    locale = QLocale::system().name();    // запрос языка (например: "ru")
    qttr = new QTranslator;
    qttr->load(QString("./qt_") + locale); // загрузка файла ./qt_*.qm
    app.installTranslator(qttr);         // устанока переводчика    
    
    // Главный виджет программы
    MyMonitor mainWin;
    mainWin.show();

    return app.exec();
}


2) Главный виджет
2.1) Файл mymonitor.ui Прикрепленный файл  mymonitor.zip ( 355 байт ) Кол-во скачиваний: 198

создан на основе QWidget, т.к. ты не использовал ничего из особенностей QMainWindow, и сможешь встроить его как обычный виджет в любую программу, по завершении тестов.
Имя главного класса: MyMonitor
Имя древовидного представления: view

2.2) На его основе создаю класс MyMonitor (два файла mymonitor.cpp/h) с монежественным наследованием, от QWidget и от того что в ui-файле
mymonitor.h
/*!
*    \file    mymonitor.h
*    \brief    Интерфейс класса "MyMonitor".
*/
#ifndef MYMONITOR_H
#define MYMONITOR_H

#include "ui_mymonitor.h"

/*!
*    \class MyMonitor
*    \brief Класс MyMonitor.
*
*     Этот класс является главным окном программы
*/
class MyMonitor : public QWidget, public Ui::MyMonitor
{
    Q_OBJECT

public:
    MyMonitor(QWidget *p_parent = 0);



};

#endif //MYMONITOR_H

mymonitor.cpp
/*!
*    \file    mymonitor.cpp
*    \brief    Реализация класса "MyMonitor".
*/

#include <QtGui>

#include "mymonitor.h"


MyMonitor::MyMonitor(QWidget* p_parent) : QWidget(p_parent)
{
    setupUi(this);

    setWindowTitle(tr("Тест модели-дерева"));
}

Все. Это должно компилится и к этому более не возвращаемся, вся прочая работа по подключению к модели ведется в конструкторе MyMonitor.

Далее мои действия были бы такими:
3) Продумывание способа хранения данных.
4) Создание модели
5) Подключение ее к представлению, как указано выше.

------
Теперь вопрос, откуда идея: "класс иерархической структуры - за счет использования QHash"?

Т.е. почему такой способ хранения данных? Откуда берутся данные?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 5.1.2025, 18:02