如果代码中没有连接任何插槽,是否有理由发出Qt信号?
Is there a reason to emit a Qt signal if there is no slot connected anywhere in the code?
我是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 子模块。他们可能正在使用这些信号。在开始删除功能之前,您需要确保。
这取决于意图。如果不使用,可以删除。
-
信号表示可能值得处理或做出反应的情况。连接到它们是可选的。
-
信号以及 API 的其余部分是一个合约。您不能在不破坏功能的情况下更改协定。
如果停止发射信号,依赖于此类模块的项目的一部分可能会失败(或者只是停止按预期工作,这可能会更糟且更难检测(。在这种情况下,您应该记录它,更改 API 版本...
如果不再发出,你也应该删除信号声明(或以某种方式将其标记为不推荐使用(,因此,至少编译将在依赖模块中失败(如果使用Qt 5语法,如果仍然使用SIGNAL
宏,它将更难检测,并且只能实时检测(。
显然,它与基础模块的 API 不同,与顶级项目中没有人依赖且您可以完全控制的类不同。
- 是否有理由在标题中保留完全专用的模板?
- 如果我有很多具有相似前缀的字符串,是否有理由从该前缀创建一个子字符串?
- 如果代码中没有连接任何插槽,是否有理由发出Qt信号?
- 是否有理由对非负常量使用无符号类型?
- 是否有理由大多数/所有 try-catch 示例只对 throw 语句使用 void 子函数
- 自我分配有用时是否存在情况
- 是否仍然有理由在C++代码中使用"int"
- 是否有理由使用 malloc 初始化构造函数中的指针
- 是否有理由跳过for循环的初始化
- C++11:是否有理由为什么某些常规类型不应该专门使用“std::hash”
- 是否有理由不使用单元强制类型
- C++:是否有理由使用uint64_t而不是size_t
- 是否有理由使用字符串 => 索引到向量的映射,而不是字符串 => 对象?
- 有理由使用"::template"吗?
- 在这段代码中,是否有理由对字符串文字使用const_cast
- 是否有理由无法默认构造具有空捕获列表的 lambda?
- 是否有理由不从可执行文件中删除符号?
- 是否有理由显式声明模板类型
- 是否有理由在错误处理的代码中不广泛看到错误?
- 是否有理由选择一个变量的多个unordered_map而不是结构体的多个unordered_map ?