我正在定制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
答案 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();
编译。