我正在自定义 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 会再次恢复 UI。
一个。QNetworkAccessManager 使用场景有什么特别之处,即它应该在全局范围内创建还是什么?我浏览了它的文档,但没有找到任何东西。
湾。是否有关于 Qt 的任何特殊约定,或者它与我缺少的 VLC 一起使用?我在 c/c++ 和 Linux 方面经验丰富,但对 QT 很陌生。
UPDATE1:我也看到了这个 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 的基本本地创建工作。有关详细信息,请参阅此 vlc 邮件列表线程