2

vlcソースコードをカスタマイズしていて、Qt OpenDialog(vlcのQT UIダイアログの一部)からQNetworkAccessManagerを使用する必要があります。

次のコードサンプルを使用しようとしています

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);
}

私の主な問題は、次のように1回の呼び出しがあっても、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が再び表示されます。

a。QNetworkAccessManagerの使用シナリオに関して特別なことはありますか?つまり、グローバルに作成する必要がありますか?ドキュメントを調べましたが、何も見つかりませんでした。

b。Qtに関する特別な規則はありますか、それともVLCでの使用で私が見逃しているものはありますか?私はc/c ++とLinuxの経験が豊富ですが、QTは初めてです。

UPDATE1:基本的にQNetworkAccessManagerを使用して同じhttpgetを実行しようとしているこのSOの質問も見ました。ただし、これを1つの単純なAPIと呼ぶことは、別のモジュールとして実行する必要はないと思います(質問は新しいモジュールを作成しようとします)?または、qt / vlcにそのような制限はありますか?

UPDATE2:これまでのところ、vlcqtuiセクションに新しいクラスを追加することと関係があると思います。vlcを使用したqtインストールに付属するhttpの例を含めてみましたが、同じ動作が見られます。vlcuiコンポーネントに.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のサブクラスの1つにアクセスしています

QNetworkAccessManager * qnam = &NETWORK_MANAGER;

UPDATE 4また、makeファイルにQtNetworkを手動で含めることにも問題があり(ヘッダーのコンパイルでは文句を言わなかったものの)、vlcuiを読み込めなかったことも発見しました。ただし、メインのvlc構成ファイルに追加すると、QNetworkAccessManagerの基本的なローカル作成でも機能しました。詳細については、このvlcメーリングリストスレッドを参照してください

4

1 に答える 1

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();

于 2012-12-14T00:55:34.137 に答える