如何从vlc媒体播放器源代码中使用QNetworkAccessManager

时间:2012-12-10 11:41:02

标签: c++ qt4 vlc

我正在定制vlc源代码,需要使用Qt OpenDialog的QNetworkAccessManager(vlc的QT UI对话框的一部分)。

我正在尝试使用following代码示例

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也无法加载UI,如下所示:

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会再次带回UI。

一个。关于QNetworkAccessManager使用场景是否有任何特殊之处,即它应该是全局创建的还是什么?我浏览了它的文档,但没有找到任何东西。

湾是否有任何关于Qt的特殊约定或它与VLC一起使用我缺少的?我在c / c ++和Linux方面经验丰富,但对QT来说却是新手。

UPDATE1:我也看到this SO question,它基本上是尝试使用QNetworkAccessManager执行相同的httpget。但是,我认为调用这个简单的api不需要作为一个单独的模块完成(问题是尝试编写一个新模块)?或者在qt / vlc中有任何此类限制

UPDATE2:到目前为止,我怀疑它与将新类添加到vlc qt ui部分有关。我尝试包含与vlc一起安装qt的http示例,但是看到了相同的行为。在vlc ui组件中包含.cpp和.h的任何指南都会有所帮助。

更新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的基本本地创建也能正常工作。有关详细信息,请参阅this vlc mailing list thread

1 个答案:

答案 0 :(得分:2)

应该全局创建QNetworkAccessManager。如果在类或方法中创建它,它将使用对象(或方法)销毁,并且您发送的请求将丢失。此外,我已经在一个程序中遇到了几个QNetworkAccessManager的问题所以我建议你做这样的事情:

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();编译。