如何使用来自vlc媒体播放器的QNetworkAccessManager源代码



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

我正在尝试使用以下代码示例

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,用户界面就会再次出现。

a。QNetworkAccessManager的使用场景有什么特别之处吗?即它应该是全局创建的还是其他什么?我查阅了它的文档,但没有找到任何东西。

b。有没有关于Qt的任何特殊约定,或者我缺少的它与VLC的使用?我在c/c++和Linux方面有着丰富的经验,但对QT还是个新手。

更新1:我也看到了这个SO问题,基本上是试图使用QNetworkAccessManager执行相同的httpget。然而,我相信调用这一个简单的api不需要作为一个单独的模块来完成(这个问题试图编写一个新的模块)?或者qt/vlc 中是否存在此类限制

UPDATE2:到目前为止,我怀疑这与在vlc-qt-ui节中添加一个新类有关。我尝试将qt安装附带的http示例包含在vlc中,但看到了相同的行为。任何关于在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;

UPDATE 4我还发现手动将QtNetwork包含到make文件中也是有问题的(尽管它在编译头文件时没有抱怨),并且vlc ui无法加载。然而,当我将其添加到主vlc配置文件中时,即使是QNetworkAccessManager的基本本地创建也起到了作用。有关的详细信息,请参阅此vlc邮件列表线程

应全局创建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;
// ...

EDIT:如果不起作用(参见问题中的更新3),请尝试QNetworkAccessManager NETWORK_MANAGER;而不是a_module.cpp中的QNetworkAccessManager NETWORK_MANAGER = QNetworkAccessManager();。这要归功于编译器。与MSVC不同,g++使用QNetworkAccessManager NETWORK_MANAGER;编译,但不使用QNetworkAccessManager NETWORK_MANAGER = QNetworkAccessManager();

相关内容

  • 没有找到相关文章

最新更新