Как использовать QNetworkAccessManager из исходного кода медиаплеера vlc

Я настраиваю исходный код vlc, и мне нужно использовать QNetworkAccessManager из Qt OpenDialog (часть диалогов QT UI для vlc).

Я пытаюсь использовать следующий пример кода

void MainWindow::requestShowPage(){
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager,SIGNAL(finished(QNetworkReply*)),this,SLOT(requestReceived(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://google.com")));
}

void MainWindow::requestReceived(QNetworkReply* reply){
QString replyText;
replyText.fromAscii(reply->readAll());
ui->txt_debug->appendPlainText(replyText);
}

Моя основная проблема заключается в том, что vlc не может загрузить пользовательский интерфейс, даже если есть один вызов следующим образом:

QNetworkAccessManager *manager = new QNetworkAccessManager(this);

Следующее — вывод, произведенный на консоли vlc

./vlc
[0x19c9388] main libvlc: Running app with the default interface.
[0x1f82988] main interface error: corrupt module: /VLC/vlc-2.0.4/modules/gui/qt4/.libs/libqt4_plugin.so
[0x2586748] main generic error: corrupt module: /VLC/vlc-2.0.4/modules/gui/qt4/.libs/libqt4_plugin.so
[0x1f82988] skins2 interface error: no suitable dialogs provider found (hint: compile the qt4 plugin, and make sure it is loaded properly)
[0x1f82988] skins2 interface error: cannot instantiate qt4 dialogs provider
[0x1f82988] [cli] lua interface: Listening on host "*console".

Простое опускание QNetworkAccessManager возвращает пользовательский интерфейс снова.

а. Есть ли что-то особенное в сценариях использования QNetworkAccessManager, т. Е. Должно ли оно быть создано глобально или что-то в этом роде? Я просмотрел его документацию, но ничего не нашел.

б. Есть ли какие-то особые соглашения в отношении Qt или его использования с VLC, которые мне не хватает? У меня большой опыт работы с c / c ++ и Linux, но я новичок в QT.

Update1: Я видел этот ТАК вопрос тоже, который в основном пытается сделать то же самое httpget, используя QNetworkAccessManager. Тем не менее, я считаю, что вызов этого простого API-интерфейса не обязательно должен выполняться как отдельный модуль (вопрос пытается написать новый модуль)? Или есть ли такое ограничение в QT / VLC?

UPDATE2: Пока я подозреваю, что это связано с добавлением нового класса в раздел vlc qt ui. Я попытался включить пример http, который идет с установкой qt с vlc, но вижу то же самое поведение. Любые рекомендации по включению .cpp и .h в компоненты vlc ui будут полезны.

ОБНОВЛЕНИЕ 3: Я следовал рекомендациям, приведенным в ответе ниже, и не вижу смысла в следующих ошибках компиляции. Может ли кто-нибудь помочь?

/usr/include/qt4/QtCore/qobject.h: In copy constructor ‘QNetworkAccessManager::QNetworkAccessManager(const QNetworkAccessManager&)’:
/usr/include/qt4/QtCore/qobject.h:333:5: error: ‘QObject::QObject(const QObject&)’ is private
In file included from /usr/include/qt4/QtNetwork/QNetworkAccessManager:1:0,
from qt4.hpp:39,
from qt4.cpp:37:
/usr/include/qt4/QtNetwork/qnetworkaccessmanager.h:72:24: error: within this context
qt4.cpp: At global scope:
qt4.cpp:192:63: note: synthesized method ‘QNetworkAccessManager::QNetworkAccessManager(const QNetworkAccessManager&)’ first required here
In file included from qt4.cpp:54:0:

============

qt4.hpp содержит следующие добавленные в глобальном масштабе

#include <QNetworkAccessManager>
extern QNetworkAccessManager NETWORK_MANAGER;

qt4.cpp содержит это в глобальном масштабе

QNetworkAccessManager NETWORK_MANAGER = QNetworkAccessManager();

и тогда я обращаюсь в один из подклассов QT4

QNetworkAccessManager * qnam = &NETWORK_MANAGER;

ОБНОВЛЕНИЕ 4 Я также обнаружил, что ручное включение QtNetwork в файл make также было проблематичным (хотя он не жаловался при компиляции для заголовков), и vlc ui не удалось загрузить. Однако, когда я добавил его в основной файл конфигурации vlc, даже базовое локальное создание QNetworkAccessManager сработало. Увидеть эта ветка рассылки vlc для деталей

2

Решение

QNetworkAccessManager должны быть созданы глобально. Если вы создадите его в классе или в методе, он будет уничтожен объектом (или методом), а отправленные вами запросы будут потеряны. Более того, у меня уже возникли проблемы с несколькими QNetworkAccessManagers в программе Итак, я рекомендую вам сделать что-то вроде этого:

a_module.hpp:

// ...

#ifndef THE_MODULE
#define THE_MODULE

// ...

#include <QNetworkAccessManager>

// ...

extern QNetworkAccessManager NETWORK_MANAGER;

// ...

#endif    // THE_MODULE

a_module.cpp:

// ...

#include "a_module.hpp"
// ...

QNetworkAccessManager NETWORK_MANAGER = QNetworkAccessManager();

// ...

В вашем коде:

// ...

#include "a_module.hpp"
// ...

QNetworkAccessManager * qnam = &NETWORK_MANAGER;

// ...

РЕДАКТИРОВАТЬ Если это не работает (см. обновление 3 в вопросе), попробуйте QNetworkAccessManager NETWORK_MANAGER; вместо QNetworkAccessManager NETWORK_MANAGER = QNetworkAccessManager(); в a_module.cpp, Это связано с компилятором. В отличие от MSVC, g ++ компилируется с QNetworkAccessManager NETWORK_MANAGER; но нет QNetworkAccessManager NETWORK_MANAGER = QNetworkAccessManager();,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]