QTJambi-QNetworkManager,来自thread';我不能发出信号

QTJambi-QNetworkManager,来自thread';我不能发出信号,qt,multithreading,qt-jambi,qnetworkaccessmanager,Qt,Multithreading,Qt Jambi,Qnetworkaccessmanager,我是QT(jambi)的新手。我有一个非常简单的QTJambi(4.5.2)应用程序。我试图弄明白为什么这在一个线程中不起作用(DoResponseRady从未调用)。在threaded=true/false之间切换静态变量以重新生成 import com.trolltech.qt.core.QByteArray; import com.trolltech.qt.core.QUrl; import com.trolltech.qt.gui.QApplication; import com.tr

我是QT(jambi)的新手。我有一个非常简单的QTJambi(4.5.2)应用程序。我试图弄明白为什么这在一个线程中不起作用(DoResponseRady从未调用)。在threaded=true/false之间切换静态变量以重新生成


import com.trolltech.qt.core.QByteArray;
import com.trolltech.qt.core.QUrl;
import com.trolltech.qt.gui.QApplication;
import com.trolltech.qt.gui.QPushButton;
import com.trolltech.qt.network.QNetworkAccessManager;
import com.trolltech.qt.network.QNetworkReply;
import com.trolltech.qt.network.QNetworkRequest;


public class Main {
 static boolean threaded = false;
 static Main main;

 public static void main(String[] args) {
  QApplication.initialize(args);
  main = new Main();  
  main.doit();
 }

 void DoResponseReady(QNetworkReply reply) {
  System.out.println("Response Ready");
 }

 void testnetwork_thread()
 {
  new Thread(new Runnable() {
   @Override
   public void run() {
    testnetwork();    
   }
  }).start();  
 }

 void testnetwork()
 {
  QNetworkAccessManager qnam = new QNetworkAccessManager();
  QNetworkRequest req = new QNetworkRequest(new QUrl("http://junkurl.neverwillwork.ok"));  
  QByteArray data = new QByteArray();
  qnam.finished.connect(main, "DoResponseReady(QNetworkReply)");
  qnam.post(req, data);    
 }

 void NetworkTest()
 {
  if (threaded)   
   testnetwork_thread();
  else
   testnetwork();
 }

 public void doit() {
        QPushButton quit = new QPushButton("Test");
        quit.clicked.connect(this, "NetworkTest()");
        quit.show();
        QApplication.exec();
 } 
}

您的线程没有QT事件循环,因此不会发生任何事情

<>我在java中没有使用Qt,而是C++,所以我不能给你示例代码,但是这个页面应该有帮助:

话虽如此。。。试试这个:

void testnetwork_thread()
 {
  new Thread(new Runnable() {
   @Override
   public void run() {
    QEventLoop loop = new QEventLoop();
    testnetwork();    
    loop.exec();
   }
  }).start();  
 }
请注意,这应该只是为您指出了正确的方向,您需要处理同步问题等。还请注意讨论QObject所有权和线程(线程关联)的段落


<>在C++中,我创建了一个扩展Q线程的类和一个叫做“WorkWork”的抽象接口。QThread派生类将Worker对象作为构造函数中的参数,并更改关联性,使其由该线程“拥有”(请参见:moveToThread()。然后在重写的run()方法中,它调用Worker::init()方法,然后启动事件循环。我会启动init()方法中需要处理的任何初始事务,例如计时器或网络请求。

谢谢。虽然我还没有证实这是一个问题,但它帮助我指明了方向。我一核实就回来。