我正在自定义vlc源代码,需要使用Qt OpenDialog(用于vlc的QT UI对话框的一部分)中的QNetworkAccessManager。
我正在尝试使用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的使用情况,是否有什么特别的地方,即它应该是全局创建的?我浏览了它的文档,但没有发现任何东西。
b。是否有关于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。
最佳答案
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();
进行编译。关于c++ - 如何从VLC媒体播放器源代码使用QNetworkAccessManager,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13800256/