Qt Slot没有被叫

时间:2013-03-23 16:47:52

标签: c++ qt signals

我有一个程序,我将QSignalMapper多个信号从对象连接到主程序中的一个插槽:

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
}

然后,由于程序是一种服务器,我让他循环,等待新客户,...

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

你能帮我吗

3 个答案:

答案 0 :(得分:2)

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

您必须致电QApplication::exec()让Qt传递信号。

编辑已更改的代码:只需删除for(;;) - 循环,这是不必要的。 QApplication :: exec()有自己的循环。

答案 1 :(得分:1)

  

但是从不调用插槽。

关于QApplication::exec的Qt文档说:

  

进入主事件循环并等待直到调用exit()[...]。   必须调用此函数来启动事件处理。主事件循环从窗口系统接收事件并将这些事件分派给应用程序窗口小部件。 [...]   通常,在调用exec()之前不能进行任何用户交互。 [...]

这意味着它是负责信号槽系统的exec方法。您正在调用A::run(在exec函数之前),其中包含for(;;)无限循环,这将阻止执行实际循环,从而导致信号丢失。

答案 2 :(得分:-1)

我找到了解决办法。除了我不确定它是非常有效的,我的解决方案是在QEventLoop循环的每个循环开始for(;;),并在QEventLoop超时时使QTimer退出