0

我有一个程序,在该程序中,我将 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
}

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

但是插槽永远不会被调用。我在想这可能是因为程序始终处于循环中,并且从不检查是否已发出信号。

你能帮我么

4

3 回答 3

2

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

您必须调用QApplication::exec()才能让 Qt 传递信号。

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

于 2013-03-23T16:53:01.957 回答
1

但是插槽永远不会被调用。

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

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

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

于 2013-03-23T17:33:21.083 回答
-1

我找到了解决方法。除了我不确定它是否非常有效之外,我的解决方案是QEventLoop在循环的每个循环中启动一个for(;;),并且我在超时时QEventLoop退出QTimer

于 2013-03-23T17:38:10.043 回答