我经常需要的典型线路是
connect(thread, SIGNAL(started()), this->actExecute, SLOT(setDisabled(>>bool<<)));
但是 afaik 你不能连接具有不同签名的信号/插槽。
通常建议使用辅助方法来触发/发出传递真/假的自定义信号,但是我有很多动作需要在线程启动/停止/其他时禁用/启用,所以我想避免写几十个辅助功能/信号。
有没有更好的方法(也许是单行解决方案)?
我经常需要的典型线路是
connect(thread, SIGNAL(started()), this->actExecute, SLOT(setDisabled(>>bool<<)));
但是 afaik 你不能连接具有不同签名的信号/插槽。
通常建议使用辅助方法来触发/发出传递真/假的自定义信号,但是我有很多动作需要在线程启动/停止/其他时禁用/启用,所以我想避免写几十个辅助功能/信号。
有没有更好的方法(也许是单行解决方案)?
有一种方法可以做到这一点,但这取决于 Qt 5 和 C++11。您可以使用 lambda 表达式来调用具有适当参数的插槽。最近有一个问题询问如何专门使用 QTimers 执行此操作,这里是我之前给出的答案的链接。
基本上,代码看起来像这样 -
connect(thread, &QThread::started, this->actExecute, [=]() {
setDisabled(true);
} );
通过从它派生QAction
并添加简单disable()
和enable()
插槽来创建您自己的 Action 类。
如果Qt 5
和C++11
不能使用,这个问题有两种可能的解决方案:
QAction
正如@Roku 所说,派生并添加2个简单的插槽(禁用/启用)。
派生QThread
并添加一个附加信号started(bool)
,该信号将在发出信号true
时使用参数started()
发出,并在发出或发出信号false
时使用参数发出,尽管我必须注意,通过启动(假)信号通知线程已完成并不是那么直观,尤其是如果您正在开发将被其他人使用的 API。finished()
terminated()
如果这两种方法都让您更改大量代码,那么我建议您改用辅助方法。除了这些,我认为你没有更好的选择。