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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как унаследовать QHash  (Прочитано 5550 раз)
iRQSX
Гость
« : Август 19, 2009, 12:04 »

Нужно создать класс который наследует QHash и дополнить своими методами. Только вот не могу понять как обращаться к данным...
Код
C++ (Qt)
class SHARED Modules: public QHash<QString, IModule*>
{
public:
   Modules(QString path);
 
};
 
Modules::Modules(QString path)
{
   QDir pluginDir(path);
   foreach (QString fileName, pluginDir.entryList(QDir::Files))
   {
QHash<QString, IModule*> h;
 
QPluginLoader loader(pluginDir.absoluteFilePath(fileName));
if (IModule *interface = qobject_cast<IModule *>(loader.instance()))
{
   [b]insert(interface->getTitle(), interface);[/b] // Правильно???
}
 
   }
}
 

Код
C++ (Qt)
Modules m(QApplication::applicationDirPath());
   m["asd"].
ничего не выдает. Да и внутри класса не понимаю как обратиться к данным. Помогите пожалуйста разобраться!
Записан
Rcus
Гость
« Ответ #1 : Август 19, 2009, 12:19 »

А что-то должен выдавать? Как вы узнаёте что какие-то плагины были загружены?
/*Оставлю при себе мнение о наследовании от контейнерного класса */
Записан
iRQSX
Гость
« Ответ #2 : Август 19, 2009, 12:26 »

Код
C++ (Qt)
class IModule
{
   public:
   virtual ~IModule(){}
   virtual QString getTitle() = 0;
   virtual QString getDescription() = 0;
   virtual int Execut() = 0;
};
 
Эти методы выдавать должен... Знаю доподлинно что есть загруженные (убрал строки которые оповещают о загрузке). если заводить его как поле то проблем нет...
/*Оставлю при себе мнение о наследовании от контейнерного класса */ Согласен, но уже интересно как это делается...
Записан
Rcus
Гость
« Ответ #3 : Август 19, 2009, 17:22 »

Все равно не могу понять проблему, то есть вставка в контейнер происходит, а при обращении по ключу возвращается default constructed value (нулевой указатель)?
Записан
iRQSX
Гость
« Ответ #4 : Август 20, 2009, 15:47 »

Я новичек, но наверное так. Вставка идет (в конструкторе) но не внутри реализации самого класса, ни при его использовании в другом месте не получается заставить отобразить QTCreator список доступных методов IModule, который возвращается операцией [], а если забить и записать ручками ошибка
G:/QProject/Loader/mainwindow.cpp:11: error: request for member `Execut' in `((QHash<QString, IModule*>*)(&m))->QHash<K, V>::operator[] [with Key = QString, T = IModule*](((const QString&)(&QString(((const char*)"RecordViewer")))))', which is of non-class type `IModule*'
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Август 20, 2009, 18:28 »

Здравствуйте
       insert(interface->getTitle(), interface); // Правильно???
Просто интересно - шо это за синтаксис? Кто такой "b" и как/где он описан? Кто кого вызывает?

Edit: перепутал, я у себя вижу

 insert(interface->getTitle(), interface); // Правильно???

Наверное это просто ошибка в отображении на web Улыбающийся Все равно не пойму - чей insert?
« Последнее редактирование: Август 20, 2009, 18:42 от Igors » Записан
iRQSX
Гость
« Ответ #6 : Август 20, 2009, 18:40 »

Жирный шрифт в кодбоксе не проставился....Остальное думаю понятно.
Не поверишь, я вот тоже. по идее это инсёт моего класса (Веди он его унаследовал), тади интереса пытался ::insert (я так понимаю это вызов метода родителя в данном случае) но при этом ошибка компиляции.
« Последнее редактирование: Август 21, 2009, 01:23 от iRQSX » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Август 21, 2009, 18:55 »

Жирный шрифт в кодбоксе не проставился....Остальное думаю понятно.
Не поверишь, я вот тоже. по идее это инсёт моего класса (Веди он его унаследовал), тади интереса пытался ::insert (я так понимаю это вызов метода родителя в данном случае) но при этом ошибка компиляции.
Спасибо, теперь понял. Если надо разобраться с QHash - лучше создать что-то скромное (типа QHash<QString, int>) и с ним поэкспериментировать. А так - и IModule. и foreach, получается что не только "изучить" а сразу и задействовать по полной Улыбающийся Конечно, если сходу пройдет - отлично, но оно не обязано всегда проходить.
Кстати, что плохого в наследовании от контейнера, и почему это считается "дурным тоном"?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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