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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Как сделать аттрибут собственного класса  (Прочитано 21313 раз)
Scotty
Гость
« Ответ #30 : Октябрь 30, 2009, 22:33 »

Ага, простите ... вот код:
Код
C++ (Qt)
QString LogItemChildren::test(){
   QString moniker = gLogItemChildren.attributes().namedItem("value").nodeValue();
   QDomElement nodes(gLogItemChildren.parentNode().parentNode().toElement());
   int i = 0;
   while(i < nodes.childNodes().count()){
       if (getMoniker(nodes.childNodes().item(i).toElement()).compare(moniker, Qt::CaseInsensitive) == 0)
           break;
       i++;
   }
   return getMoniker(nodes.childNodes().item(i).toElement());
}
 
Вот незнаю там по XML файлу бегаю и читаю из него ... но вот не совпадает почему то ...  Непонимающий
« Последнее редактирование: Октябрь 31, 2009, 00:04 от Scotty » Записан
BRE
Гость
« Ответ #31 : Октябрь 30, 2009, 22:39 »

А ты поставь в разных местах отладочный вывод (qDebug) и посмотри, что там в строки загружается и что с чем сравнивается.
Записан
Scotty
Гость
« Ответ #32 : Октябрь 30, 2009, 23:32 »

Сделал вывод - правильно выводит  Злой Строго 2 соответствия во всем списке, но при выполнении этого алгоритма - не работает  Злой
Записан
BRE
Гость
« Ответ #33 : Октябрь 30, 2009, 23:36 »

Код
C++ (Qt)
QString LogItemChildren::test(){
   QString moniker = gLogItemChildren.attributes().namedItem("value").nodeValue();
   QDomElement nodes(gLogItemChildren.parentNode().parentNode().toElement());
   int i = 0;
   while(i < nodes.childNodes().count()){
       if (getMoniker(nodes.childNodes().item(i).toElement()).compare(moniker, Qt::CaseInsensitive) == 0)
// Произошло совпадение, выходим из цикла и....
           break;  
       i++;
   }
// возвращаем строку из 5 элемента...
   return getMoniker(nodes.childNodes().item(5).toElement());
}
 
Или я алгоритм не понял?
Что он должен делать?
Записан
Scotty
Гость
« Ответ #34 : Октябрь 30, 2009, 23:58 »

Он берет и получает идентификатор (или прозвище как там у меня называется), запоминает и шерстит все ноды которые находятся выше её по иерархии как только находит  - обрывает цикл и возвращает идентификатор нужной ноды. Там структура немного странноватая:
Код:
<node>
  <childs>
    <child moniker="1">
  </childs>
<prp moniker="0"/>
</node>
<node>
  <childs/>
  <prp moniker="1"/>
</node>
Т.е. первый итем - родитель, второй дочерний. Вот второй то мне и надо получить по идентификатору.
« Последнее редактирование: Октябрь 31, 2009, 00:03 от Scotty » Записан
BRE
Гость
« Ответ #35 : Октябрь 31, 2009, 00:02 »

Он берет и получает идентификатор (или прозвище как там у меня называется), запоминает и шерстит все ноды которые находятся выше её по иерархии как только находит  - обрывает цикл и возвращает идентификатор нужной ноды.
Он всегда возвращает идентификатор 5 ноды.
Записан
Scotty
Гость
« Ответ #36 : Октябрь 31, 2009, 00:04 »

 Смеющийся Пардон это я неправильно написал, это я так отлаживался
Записан
BRE
Гость
« Ответ #37 : Октябрь 31, 2009, 00:14 »

Попробуй так, посмотри что выводиться на консоль:
Код
C++ (Qt)
QString LogItemChildren::test(){
   QString moniker = gLogItemChildren.attributes().namedItem("value").nodeValue();
   qDebug() << moniker;
 
   QDomElement nodes(gLogItemChildren.parentNode().parentNode().toElement());
   int i = 0;
   while(i < nodes.childNodes().count()){
QString v = getMoniker( nodes.childNodes().item(i).toElement() );
qDebug() << v
       if (v.compare(moniker, Qt::CaseInsensitive) == 0)
return v;
       i++;
   }
   return QString();
}
 

Еще смутило, но может так задумано:
QDomElement nodes(gLogItemChildren.parentNode().parentNode().toElement());
Записан
Scotty
Гость
« Ответ #38 : Октябрь 31, 2009, 00:22 »

Да! Вот только что сам дошел до этого ... там не
Код
C++ (Qt)
QDomElement nodes(gLogItemChildren.parentNode().parentNode().toElement());
, а
Код
C++ (Qt)
QDomElement nodes(gLogItemChildren.parentNode().parentNode().parentNode().toElement());
там на 3 уровня вверх надо подниматься, это именно так и задуманно ... спасибо ещё раз за терпение, просто надо было  попристальнее вглядеться в код ... и в файл с данными  Веселый
Записан
Scotty
Гость
« Ответ #39 : Ноябрь 02, 2009, 00:33 »

Товарищи!!! Улыбающийся Помогите ещё раз, на сей аз вопрос не очень простой (ну это конечно же для меня Улыбающийся ). Есть у меня набор классов для работы с XML файлом, они описаны выше, но вот последняя заковыка в том, что  я написал ещё набор классов, которые работают с файлами другого рода, но тоже xml и незнаю как правильно их связать. Вот эти классы:
Код
C++ (Qt)
class LogDescription;
class LogSuite;
class LogItem;
class LogItemChildren;
class LogMessages;
class LogMessage;
 
class LogMessage{
public:
   LogMessage();
   LogMessage(QDomElement aLogMessage);
   ~LogMessage();
   QString getMessage();
private:
    void setRelativePath(QString aPath);
protected:
    QDomElement gLogMessage;
    QString gLogPath;
friend class LogMessages;
};
 
class LogMessages
{
public:
   LogMessages();
   ~LogMessages();
   int openFile(QString aFileName);
   int getMessagesCount();
   QString getFileName();
   QString getFilePath();
   LogMessage getLogMessage(int aLogMessageIndex);
protected:
   QString gLogPath;
   QString gLogFileName;
   QDomDocument * gLogMessagesDocument;
};
 
class LogItemChildren{
public:
   LogItemChildren(const QDomElement &aChildrenItem);
   ~LogItemChildren();
   QString getRelativeFileName();
   QString getChildrenMoniker();
   LogItem getLogItem();
   QString test();
private:
   void setRelativePath(QString aPath);
protected:
   QDomElement gLogItemChildren;
   QString gLogPath;
friend class LogItem;
};
 
class LogItem{
public:
   LogItem(const QDomElement &aLogItem);
   ~LogItem();
   QString getFileName();
   QString getOwnerMoniker();
   QString getName();
   int getStatus();
   QString getMoniker();
   QString getTest();
   QString getPersistentDataKey();
   QString getProjectKey();
   QString getRelativeFileName();
   bool hasChildren();
   int getChildrenCount();
   LogItemChildren getChildren(int aChildrenindex);
   LogMessages getLogMessages();
private:
   void setRelativePath(QString aPath);
protected:
   QDomElement gLogItem;
   QString gLogPath;
friend class LogSuite;
friend class LogItemChildren;
};
 
class LogSuite{
public:
   LogSuite();
   ~LogSuite();
   int openFile(QString aFileName);
   void closeFile();
   QString getFilePath();
   QString getFileName();
   int getTotalItemsCount();
   LogItem getLogItem(int aItemIndex);
protected:
   QString gLogPath;
   QString gLogFileName;
   QDomDocument * gLogSuiteDocument;
};
 
Как видно из заголовков, LogItem::getLogMessages() возвращает экземпляр класса LogMessages. Всё бы было хорошо, но вот описание данных класса LogMessages лежит в другом файле (физически в другом но рядом), так вот не перечитывать же мне каждый раз при вызове метода файл с данными дя этого класса. Идея решения есть - просто хранить в памяти экземпляр класса LogMessages пока не будет уничтожен объект класса LogItem, тогда контекст смениться и естественно смениться ссылка на файл. Создавать думаю надо в конструкторе LogMessages. А вот как это сделать пока не понимаю (глупповат ещё), подкажите пожалуйста как мне увязать сие друг с другом Непонимающий
« Последнее редактирование: Ноябрь 02, 2009, 17:20 от Scotty » Записан
Scotty
Гость
« Ответ #40 : Ноябрь 02, 2009, 19:19 »

Вот самое плохое, что когда всё сделаешь, перед последним рывком остается какая нибудь заковыка и всё !!! Всё летит как фанера над Парижем.  Плачущий
Записан
Scotty
Гость
« Ответ #41 : Ноябрь 02, 2009, 22:10 »

Хм ... нешто мыслей нет ? Или я чего опять ступил ?
Записан
Scotty
Гость
« Ответ #42 : Ноябрь 03, 2009, 00:40 »

Пробовал сделать вроде синглетона (хранить один экземпляр на класс), но что то н е очень получилось - писал так:
Код
C++ (Qt)
class LogItem
{
public:
   LogItem(const QDomElement &aLogItem);
   ~LogItem();
   QString getFileName();
   QString getOwnerMoniker();
   QString getName();
   int getStatus();
   QString getMoniker();
   QString getTest();
   QString getPersistentDataKey();
   QString getProjectKey();
   QString getRelativeFileName();
   bool hasChildren();
   int getChildrenCount();
   LogItemChildren getChildren(int aChildrenindex);
   LogMessages * getLogMessages();
private:
   void setRelativePath(QString aPath);
protected:
   QDomElement gLogItem;
   QString gLogPath;
   LogMessages * gLogMessages;
friend class LogSuite;
friend class LogItemChildren;
};
 
А в реализации вот что:
Код
C++ (Qt)
LogMessages * LogItem::getLogMessages(){
   if (!gLogMessages){
       gLogMessages->openFile(this->gLogPath + "/" + this->getFileName());
       return gLogMessages;
   } else
       return gLogMessages;
}
 
LogItem::LogItem(const QDomElement &aLogItem):gLogItem(aLogItem){
   this->gLogMessages = new LogMessages;
}
 
LogItem::~LogItem(){
   delete gLogMessages;
}
 
В результате вылетает с ошибкой:
Сигнатура проблемы:
  Имя события проблемы:   APPCRASH
  Имя приложения:   Log_Test.exe
  Версия приложения:   0.0.0.0
  Отметка времени приложения:   4aef5171
  Имя модуля с ошибкой:   QtXmld4.dll
  Версия модуля с ошибкой:   4.5.2.0
  Отметка времени модуля с ошибкой:   4a3f7c18
  Код исключения:   c0000005
  Смещение исключения:   000060bf
  Версия ОС:   6.1.7600.2.0.0.256.1
  Код языка:   1049
  Дополнительные сведения 1:   0a9e
  Дополнительные сведения 2:   0a9e372d3b4ad19135b953a78882e789
  Дополнительные сведения 3:   0a9e
  Дополнительные сведения 4:   0a9e372d3b4ad19135b953a78882e789

Помогите пожалуйста убогому, сами мы не местные Улыбающийся
« Последнее редактирование: Ноябрь 03, 2009, 00:43 от Scotty » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #43 : Ноябрь 03, 2009, 04:04 »

Код
C++ (Qt)
LogMessages * LogItem::getLogMessages(){
   if (!gLogMessages){
       gLogMessages->openFile(this->gLogPath + "/" + this->getFileName());
       return gLogMessages;
   } else
       return gLogMessages;
}
 

Бегло осмотрев код, нашёл вот это... Тут программа упадёт, разыменование нулевого указателя. Возможно ещё где-то, просмотри весь код.

Если ты сам уже не разбираешься в коде, перепиши всё с нуля, поэтапно.
Записан
Scotty
Гость
« Ответ #44 : Ноябрь 03, 2009, 09:26 »

Мда ... я код видно уже не понимал, там точно валиться будет, щас попробую перекомпилировать, только НЕ убиру. Но вобще правилен ли подход, я не понимаю как это сделать ...
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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