如果代码中没有连接任何插槽,是否有理由发出Qt信号?



我是Qt的新手,从一位离开我们公司的开发人员那里接手了一个项目。我在他的代码中看到几个地方发出信号,但没有连接到插槽或代码中对信号的其他引用。有没有我不知道的理由这样做?

我已经搜索了代码,试图找到任何可以引用正在发出的信号的东西,但是除了发出的代码之外,我找不到任何其他内容。

//from the header file
signals:
void newInstance();
void SingleInstance::newConnection()
{
emit newInstance(); // this is not referenced anywhere else in the project
qDebug() << "New connection loading...";
mSocket = mServer.nextPendingConnection();
connect(mSocket,SIGNAL(readyRead()),this,SLOT(readyRead()));
}

没有错误,应用程序运行正常。我只是想看看我是否因为缺乏Qt经验而缺少一些东西。

有人可能会问:为什么要止步于你的应用程序?Qt提供了很多很多在任何地方都没有使用的信号 - 你的应用程序都没有使用它们,你可能使用的Qt模块也不需要它们。您想删除这些信号吗?为什么不呢?

在典型的Qt应用中,大多数信号都没有连接。这是设计使然:信号的存在是为了表明"有趣"的情况,这可能对某人有用。"某人"是否在那里使用它们(连接到它们(不是给定的。信号和插槽是解耦软件元素的方法:在设计 API(例如类(时,您可能希望提供以后可能使用的相关信号。

应用程序代码中碰巧未连接的信号不应立即被视为冗余。想想为什么该代码的作者会包含这些信号。他们可能对它们的需求现在已经过去了(查看添加代码时的 git 历史记录,看看是否也添加了对这些信号的任何引用,但后来被删除了( - 在这种情况下,您可以考虑删除信号。但这是一个相当狭窄的情况,您应该首先了解信号所代表的设计意图。假设有一个称职的团队,出于某种原因,这些信号被放在那里。了解可能的原因(或多个原因(是更改代码的先决条件。任何代码都是如此,而不仅仅是信号定义。

另外:确保组织内没有其他项目依赖于保存您正在使用的代码的存储库。例如,有人可能将其用作 git 子模块。他们可能正在使用这些信号。在开始删除功能之前,您需要确保。

这取决于意图。如果不使用,可以删除。

  1. 信号表示可能值得处理或做出反应的情况。连接到它们是可选的。

  2. 信号以及 API 的其余部分是一个合约。您不能在不破坏功能的情况下更改协定。

如果停止发射信号,依赖于此类模块的项目的一部分可能会失败(或者只是停止按预期工作,这可能会更糟且更难检测(。在这种情况下,您应该记录它,更改 API 版本...

如果不再发出,你也应该删除信号声明(或以某种方式将其标记为不推荐使用(,因此,至少编译将在依赖模块中失败(如果使用Qt 5语法,如果仍然使用SIGNAL宏,它将更难检测,并且只能实时检测(。

显然,它与基础模块的 API 不同,与顶级项目中没有人依赖且您可以完全控制的类不同。

最新更新