信号槽连接在windows下,不在linux下连接

时间:2015-04-15 11:47:17

标签: c++ linux qt signals-slots

我正在开发必须在Windows和Linux下运行的Qt应用程序。首先,我在Windows下测试功能,因为它更容易调试。之后我在Linux下运行测试(使用colinux编译)。

现在我发现信号插槽连接很少,在Windows下工作不能在Linux下工作。在Linux下使用QErrorMessage有一些消息,比如没有这样的信号linuxDebugSignal()"或"没有这样的插槽logStartedSlot()"。但是实现了所有信号和插槽,moc_file显示它们,并且所有连接在Windows下都返回true。

编辑:

头:

#include <QtCore/QObject>

class class : public QObject
{
    Q_OBJECT

private:
Class(void);
~Class(void);

private slots:  

void checkIniFileSlot();

void logStartedSlot();

void linuxDebugSlot();

signals:

void logMessageSignal(QString, QString, QString, int);

void checkIniFileSignal();

void stopLogSignal();

void linuxDebugSignal();
};

源:

#include "qerrormessage.h"
#include "class.h"

Class::Class(void)
{
    QErrorMessage::qtHandler();

    //works
    connect(this, SIGNAL(checkIniFileSignal()), this, SLOT(checkIniFileSlot()));

    emit checkIniFileSignal();
}
Class::~Class(void)
{
}

void Class::checkIniFileSlot()
{
    m_Log = new Log();

    bool bStatus;

    //works
    bStatus = connect(this, SIGNAL(stopLogSignal()),
                    m_Log, SLOT(stopLogSlot()));

    //works
    bStatus = connect(this, SIGNAL(logMessageSignal(QString, QString, QString, int)), 
                    m_Log, SLOT(logMessageSlot(QString, QString, QString, int)));

    //works NOT no such slot logStartedSlot()
    bStatus = connect(m_Log, SIGNAL(started()), this, SLOT(logStartedSlot()));

    //works NOT no such signal linuxDebugSIgnal()
    bStatus = connect(this, SIGNAL(linuxDebugSignal()), this, SLOT(linuxDebugSlot()));              

}
void CWNcPlcServer::linuxDebugSlot()
{
    emit logMessageSignal("", "linuxDebugSlot","",Log::LOG_DEBUG);
}
void CWNcPlcServer::logStartedSlot()
{
    emit logMessageSignal("", "logStartedSlot","",Log::LOG_DEBUG);
}

很抱歉没有添加代码。一般来说,我的意思是这个问题,如果从Windows移植到linux时存在已知的障碍。如您所见,工作信号/插槽与不工作的信号/插槽没有实际区别。

我在Win7 32位系统上进行开发,colinux在WinXP 32位VM上运行,两者都具有相同的Qt版本。 我没有明确地调用qmake,我把.h .cpp .pro放在一个工作目录中,其他一切都是我使用的colinux发行版的一部分。我使用它的时间较长,没有任何问题,现在我试图获得更多关于它的信息。

解决方案:

所以,由于投票不好或其他任何原因,我无法添加答案。

问题是作为动态库实现的服务器应用程序的一部分。当dummyclient是startet时,它连接到此服务器以启动所有服务器功能。此虚拟客户端不执行任何操作,并且没有与此服务器的其他接口/通信。当实现新的服务器功能时,我们更改server.dll,dummyclient.dll保持旧状态。在Windows上似乎没问题。

在linux上更改server.so文件而不更新dummyclient.so时,找不到更新的信号和插槽。但是你可以在示例代码中看到,这些不工作的信号和插槽与虚拟客户端无关!它们用于服务器内部任务。当使用新的server.so和server.h编译dummyclient时,它可以工作,所有信号插槽连接都已建立。

我希望这是可以理解的。

我是linux的开发新手。这是正常反应吗?动态库怎么样??

1 个答案:

答案 0 :(得分:2)

如果您定义信号和插槽连接,请执行以下操作:

我们可以说这个类被称为&#34; SomeClass&#34;你有一个信号&#34; someSignal&#34; 并且你连接到&#34; DifferentClass&#34;叫做#34; someSlot&#34;

//DifferentClass *foo;

QObject::connect(this, &SomeClass::someSignal, foo, &DifferentClass::someSlot);

如果您这样连接,如果信号/插槽不兼容或不存在,您将收到编译器错误,这应该有助于确保您的代码在编译之前是正确的,而不是在运行时获取日志消息告诉您信号槽不会工作

注意:你不必输入参数,编译器会在兼容的情况下解决