2013-03-23 70 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