1

我经常需要的典型线路是

connect(thread, SIGNAL(started()), this->actExecute, SLOT(setDisabled(>>bool<<)));

但是 afaik 你不能连接具有不同签名的信号/插槽。

通常建议使用辅助方法来触发/发出传递真/假的自定义信号,但是我有很多动作需要在线程启动/停止/其他时禁用/启用,所以我想避免写几十个辅助功能/信号。

有没有更好的方法(也许是单行解决方案)?

4

3 回答 3

5

有一种方法可以做到这一点,但这取决于 Qt 5 和 C++11。您可以使用 lambda 表达式来调用具有适当参数的插槽。最近有一个问题询问如何专门使用 QTimers 执行此操作,这里是我之前给出的答案的链接

基本上,代码看起来像这样 -

connect(thread, &QThread::started, this->actExecute, [=]() {
    setDisabled(true);
  } );
于 2013-08-19T20:13:47.910 回答
1

通过从它派生QAction并添加简单disable()enable()插槽来创建您自己的 Action 类。

于 2013-08-19T20:56:19.353 回答
0

如果Qt 5C++11不能使用,这个问题有两种可能的解决方案:

1)导出QAction

QAction正如@Roku 所说,派生并添加2个简单的插槽(禁用/启用)。

2)导出QThread

派生QThread并添加一个附加信号started(bool),该信号将在发出信号true时使用参数started()发出,并在发出或发出信号false时使用参数发出,尽管我必须注意,通过启动(假)信号通知线程已完成并不是那么直观,尤其是如果您正在开发将被其他人使用的 API。finished()terminated()

如果这两种方法都让您更改大量代码,那么我建议您改用辅助方法。除了这些,我认为你没有更好的选择。

于 2014-12-31T12:35:45.977 回答