2

我正在自定义 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 邮件列表线程

4

1 回答 1

2

QNetworkAccessManager应该在全球范围内创建。如果你在类或方法中创建它,它会随对象(或方法)一起被销毁,你发送的请求也会丢失。此外,我已经在一个程序中遇到了几个QNetworkAccessManagers 的问题,所以我建议你这样做:

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();in a_module.cpp。这是由于编译器。与 MSVC 不同,g++ 编译时使用QNetworkAccessManager NETWORK_MANAGER;但不是QNetworkAccessManager NETWORK_MANAGER = QNetworkAccessManager();.

于 2012-12-14T00:55:34.137 回答