我正在开发必须在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的开发新手。这是正常反应吗?动态库怎么样??
答案 0 :(得分:2)
如果您定义信号和插槽连接,请执行以下操作:
我们可以说这个类被称为&#34; SomeClass&#34;你有一个信号&#34; someSignal&#34; 并且你连接到&#34; DifferentClass&#34;叫做#34; someSlot&#34;
//DifferentClass *foo;
QObject::connect(this, &SomeClass::someSignal, foo, &DifferentClass::someSlot);
如果您这样连接,如果信号/插槽不兼容或不存在,您将收到编译器错误,这应该有助于确保您的代码在编译之前是正确的,而不是在运行时获取日志消息告诉您信号槽不会工作
注意:你不必输入参数,编译器会在兼容的情况下解决