Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не переопределяется QIODevice::isOpen()
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
kerdster
Добрый день.
Проблема состоит в следующем - необходимо сделать производный класс от QIODevice для использования его в Phonon.
Всё бы хорошо, но столкнулся со странной проблемой - не удаётся переопределить в производном классе метод isOpen().

Объявление:
class netSource : public QIODevice
{
Q_OBJECT
public:
    explicit netSource(QObject *parent = 0);
    bool isOpen() const;
    ....
}


Определение:
bool netSource::isOpen() const
{
    qDebug() << "SRC: is Open";
    return true;
}


Пример кода:
netSource *src = new netSource(this);
    
src->isOpen(); // Работает!

Phonon::MediaObject *mediaObject = new Phonon::MediaObject(this);
mediaObject->setCurrentSource(Phonon::MediaSource(src)); // Падение! ASSERT: "ioDevice->isOpen()" in file /builddir/build/BUILD/phonon-4.4.3/phonon/iodevicestream.cpp, line 43


Там, где срабатывает ASSERT моя функция НЕ вызывается, в первом случае вывод в дебаг есть, а во втором нет.

Что за фигня такая странная? Исходники проекта прикрепил.
RazrFalcon
Не совсем понял в чем проблема, но у меня не падает. <_<

Лог:
Раскрывающийся текст
Start play:  "ololol" 
SRC: is Open
NS: Open!
NS: Seek:  0
WARNING: Phonon needs QCoreApplication::applicationName to be set to export audio output names through the DBUS interface
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/MediaController.cpp 355 Phonon-MPlayer subtitleAdded
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/MediaController.cpp 394 Phonon-MPlayer subtitleChanged New current subtitle: "None"
socket(): Address family not supported by protocol
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 180 Phonon-MPlayer objectDescriptionIndexes
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 212 Phonon-MPlayer objectDescriptionProperties
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 256 Phonon-MPlayer startConnectionChange
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 258 Phonon-MPlayer startConnectionChange Node: Phonon::MPlayer::AudioOutput
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 258 Phonon-MPlayer startConnectionChange Node: Phonon::MPlayer::MediaObject
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 268 Phonon-MPlayer connectNodes Phonon::MPlayer::MediaObject Phonon::MPlayer::AudioOutput
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 329 Phonon-MPlayer endConnectionChange
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 331 Phonon-MPlayer endConnectionChange Node: Phonon::MPlayer::AudioOutput
QP_LOGGER /tmp/yaourt-tmp-razrfalcon/aur-phonon-mplayer-git/src/phonon-mplayer/mplayer/Backend.cpp 331 Phonon-MPlayer endConnectionChange Node: Phonon::MPlayer::MediaObject
kerdster
Цитата(RazrFalcon @ 7.7.2011, 16:48) *
Не совсем понял в чем проблема, но у меня не падает. <_<

Думал проблема действительно в каком-то баге, но на другой машине проблема осталась та же:
$ out/phonon-net 
Start play:  "ololol"
SRC: is Open
NS: Open!
ASSERT: "ioDevice->isOpen()" in file /builddir/build/BUILD/phonon-4.5.0/phonon/iodevicestream.cpp, line 43
Аварийный останов (core dumped)


Смотрел в код, указанный в сообщении ACCERT, и там совершенно честно:
Q_ACCERT(ioDevice->isOpen())

Что очень странно, ведь у меня она возвращает true. Я вот не могу понять, может с переопределением в наследовании накосячил?

Собиралось и запускалось всё добро на Qt 4.6.3/Fedora 13 и Qt 4.7.2/Fedora 14, обе 32х битные.

З.Ы. - У вас почему-то нет вывода в Debug второй раз сообщения "SRC: is Open", хотя он должен быть (см. в ошибке: /phonon/iodevicestream.cpp, line 43).
RazrFalcon
У меня х32 Arch

В остальном: без понятия, так как не могу повторить багу.
kerdster
Уф, разобрался в чём дело.
Проглядел что в документации функция isOpen() не виртуальная в классе QIODevice, следовательно при передаче в phonon вызывалась функция базового класса. В документации написано:
Цитата
Returns true if the device is open; otherwise returns false. A device is open if it can be read from and/or written to. By default, this function returns false if openMode() returns NotOpen.

Следовательно добавил в свой класс просто:
bool netSource::open(OpenMode mode)
{
    qDebug() << "NS: Open!";
    this->is_opened = true;
    [b]this->setOpenMode(mode);[/b]
    return true;
}

И вуаля! Спасибо за внимание и желание помочь))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.