Russian Qt Forum

Qt => Общие вопросы => Тема начата: CL0NE от Май 10, 2010, 18:23



Название: Использование приватных классов
Отправлено: CL0NE от Май 10, 2010, 18:23
Прочитав эту тему (http://www.prog.org.ru/topic_10392_0.html) и здесь (http://zchydem.enume.net/2010/01/19/qt-howto-private-classes-and-d-pointers/) о  данном явлении, а также посмотрев сырцы, решил не подымать выше упомянутую тему, а создать новую.
Собсно как все начиналось: решил я использовать QDirIterator. Удобный класс, поддерживает фильтрацию имен файлов, стандартные флаги фильтрации (файлы-папки), но нужно было немного расширить существующие возможности - добавить список (под)каталогов, исключенных из вывода. Поглядев документацию, не нашел ничего, что можно было бы простым наследованием решить (конечно, можно уже пути, полученные от класса фильтровать, но зачем тратить время на обработку всего дерева?), и влез в исходники, где и столкнулся с данным явлением (всмысле, с приватным классом).
Возможно ли расширить функционал DirIteratorPrivate и как это сделать лучше всего (судя по всему, как-то переопределить функции pushDirectory или matchesFilters).

просьба сильно не бить :) с Qt знаком по книге Шлее (окромя QtScript), вот только С++ за два года обучения C#, PHP, Java подзабылся...


Название: Re: Использование приватных классов
Отправлено: kibsoft от Май 10, 2010, 19:17
Ничего переопределить ты не сможешь. Выход один - изменение оригинального исходного кода. Соответственно, согласно лицензии(если не commercial) ты должен открыть свой код. Но на самом деле, можешь не открывать - тебя за за это никто не убьет :) а вообще наверное придется создать 2 файлика .h и .cpp в своем проекте и скопировать туда код, где его изменить(лучше классы назвать по-другому). Другой более извращенческий(на мой взгляд) - это изменить код класса QDirIteratorPrivate и откомпилить QtCore4.dll.. лучше не делай этого :)


Название: Re: Использование приватных классов
Отправлено: CL0NE от Май 10, 2010, 21:01
Цитировать
а вообще наверное придется создать 2 файлика .h и .cpp в своем проекте и скопировать туда код, где его изменить(лучше классы назвать по-другому).
подобная попытка имела место быть :) Да вот только хитро все сделано. QDirIteratorPrivate использует один приватный метод QAbstractFileEngineIterator ибо является френдом. Потому назвать по-другому класс не получилось.

Цитировать
Другой более извращенческий(на мой взгляд) - это изменить код класса QDirIteratorPrivate и откомпилить QtCore4.dll..
либо это, либо самому попытаться написать класс с подобной функциональностью.