从另一个线程更新 QT 小部件的不那么冗长的方法?

Posted

技术标签:

【中文标题】从另一个线程更新 QT 小部件的不那么冗长的方法?【英文标题】:A less verbose way to update QT widgets from another thread? 【发布时间】:2018-04-01 18:36:48 【问题描述】:

我正在编写一个 QT 应用程序,它在其他线程上接收我需要从另一个线程更新的消息。我正在使用连接和插槽,但是为我想在每个小部件上调用的每个函数创建一个信号并将其连接起来变得难以想象。有没有更好的办法?

这是一个例子:

class StateWidget : public QWidget, public AbstractTab 
 Q_OBJECT

  \\ ...

 signals:

  void SetLeftVelocity(QString str);
  void SetRightVelocity(QString str);
  void SetLeftCurrent(QString str);
  void SetRightCurrent(QString str);

  \\ there are ~30 more of these lines. very annoying!
  \\ ...

在我的构造函数中,我需要所有的连接...

  connect(this, SIGNAL(SetLeftVelocity(QString)), ui_->left_velocity_edit,
          SLOT(setText(QString)), Qt::QueuedConnection);
  connect(this, SIGNAL(SetRightVelocity(QString)), ui_->right_velocity_edit,
          SLOT(setText(QString)), Qt::QueuedConnection);
  connect(this, SIGNAL(SetLeftCurrent(QString)), ui_->left_current_edit,
          SLOT(setText(QString)), Qt::QueuedConnection);
  connect(this, SIGNAL(SetRightCurrent(QString)), ui_->right_current_edit,
          SLOT(setText(QString)), Qt::QueuedConnection);
  connect(this, SIGNAL(SetLeftAcceleration(QString)), ui_->left_acceleration_edit,
  \\ so many more...

这是正确的做法吗?

【问题讨论】:

您的非 GUI 线程真的需要明确了解您的每一个 GUI 小部件吗?您可能想要更多地抽象一些东西,这样您的 GUI 就不会与您的非 GUI 代码如此紧密地联系在一起。例如,您可以让非 GUI 线程仅发出 variableChanged(QString varName, QVariant varValue) 信号,并将其连接到 GUI 线程中的单个插槽,该插槽基于 (varName) 在正确的小部件上调用正确的方法。 【参考方案1】:

如果信号和槽属于同一个类(在你的例子中似乎是这种情况),那么它都是封装的,所以我认为这里没有问题。

但是,如果您要混合来自不同类的信号和插槽,我宁愿采用某种 Observer pattern 设计,而不是在单个构造函数中连接所有信号/插槽。

【讨论】:

以上是关于从另一个线程更新 QT 小部件的不那么冗长的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Qt5从另一个类访问ui [重复]

如何从另一个小部件类更新小部件树 - Flutter

如何在另一个小部件更新qt中的相同内容后更新小部件内容

获取 Qt 小部件以更新使用 Qt Designer 制作的 Qt 表单中的鼠标事件

如何从另一个小部件状态处理一个小部件状态?

如何在 Qt 中创建共享小部件的子目录?