2013-03-23 72 views
0

我其中我与QSignalMapper多个信号连接从对象到一个时隙中主程序的程序:Qt的槽没有被调用

class A() 
{ 
    private: 
     QSignalMapper * signalMapperRead_; 
     std::vector<Service*> services_; 
    public: 
    void initConnection() 
    { 
     signalMapperRead_ = new QSignalMapper(); 

     connect(signalMapperRead_, SIGNAL(mapped(int)), this, SLOT(readyToSendToService(int))); 

     for (size_t i = 0 ; i < services_.size() ; ++i) 
     { 
      connect(services_.at(i), SIGNAL(readyToSendToServer()), signalMapperRead_, SLOT(map())); 
      signalMapperRead_->setMapping(services_.at(i), (int)i); 
     } 
    } 

    int run() 
    { 
     initConnection(); 
     for(;;) 
     { 
      //do stuff; 
     } 
    } 

}; 

int main() 
{ 
    QApplication app(argc, argv); 
    A * a = new A(); 
    a->run(); 
    return app.exec 
} 

然后,由于程序是一种服务器i的使他环路,并等待新的客户端,...

但插槽永远不会被调用。我在想,也许是因为程序总是在循环中,从不检查信号是否已经发出。

能否请你帮我

+0

可能会一步一步调试有一定的帮助? – gongzhitaao 2013-03-23 16:51:29

+0

执行是否离开'run()'? – cmannett85 2013-03-23 16:59:35

+0

在程序结束时,除了没有。 – lpostula 2013-03-23 17:00:11

回答

2

不要使用自己的循环,创造的QApplication并调用它的exec()方法。

你必须调用QApplication::exec() Qt的传送信号。

编辑为改变的代码:只需删除了(;;) - 环,它的uneccessary。 QApplication :: exec()有它自己的循环。

+0

修改我的代码,以更好地解释我是如何使用这个 – lpostula 2013-03-23 16:56:49

1

但插槽永远不会被调用。

Qt文档约QApplication::exec说:

进入主事件循环并等待退出()被调用[...]。 有必要调用此函数来启动事件处理。主事件循环从窗口系统接收事件并将它们分派给应用程序小部件。 [...] 通常,在调用exec()之前,不会发生用户交互。 [...]

这意味着它是exec方法,照顾信号槽系统。您呼叫A::run(在exec函数之前),其中包含一个for(;;)无限循环,这将阻止执行导致你的信号丢失真正的循环。

-1

我找到了解决办法。除此之外,我不知道它的效率非常高,我的解决办法是启动QEventLoopfor(;;)循环的每个周期,和我做了这个QEventLoop退出上QTimer超时

+2

你为什么不使用'QApplication'事件循环,而不是实现自己的?你正在为自己制造工作和问题。 – cmannett85 2013-03-23 17:42:42

+1

只需放下你自己的循环。它所做的只是无用的工作而烧毁你的CPU。在每次循环迭代中创建(并删除)整个QApplication对象并不会让它变得更好。 – Geier 2013-03-23 17:49:48

+0

我必须使用我自己的循环,因为这是一个学校项目,我们可以使用Qt来处理一些东西,但是例如我们不能使用QThread。 – lpostula 2013-03-23 18:00:30