梦想的彼岸花开 2024-04-18 09:25 采纳率: 77.8%
浏览 2
已结题

QT 信号槽怎么使用更好?

使用 QT 编程时,主窗口创建了其他窗口类对象,用户点击其他窗口中的按钮时,操作由主窗口完成,那么我绑定的时候怎么绑定呢?

  1. 其他窗口类自己 connect 按钮和槽,然后在槽处理函数中 emit 一个信号,主窗口类绑定该信号与对应的槽函数进行处理。
class B
  : public QWidget
{
  Q_OBJECT
  // 函数
public slots:
  void onBtnOpenClicked();
  void connectSignalsSlots();
signals:
  void onOpen();

private:
  QPushButton *pBtnOpen
};

void B::connectSignalsSlots()
{
  connect(pBtnOpen, SIGNAL(clicked()), this, SLOT(onBtnOpenClicked()));
}

void B::onBtnOpenClicked()
{
  emit onOpen();
}


class A
  : QMainWindow
{
  Q_OBJECT
public:
  void connectSignalsSlots();
  void onOpen();

public:
  B * b;
}

void A::connectSignalsSlots()
{
  connect(b, &B::onOpen, this, &A::onOpen);
}
void A::onOpen()
{
  //...
}
  1. 其他窗口类的按钮 public 化,然后直接在主窗口类中绑定该窗口类的按钮与自己的处理函数
class B
  : public QWidget
{
  Q_OBJECT
  // 函数
public:
  QPushButton *pBtnOpen
};

class A
  : QMainWindow
{
  Q_OBJECT
public slots:
  void connectSignalsSlots();
  void onBtnOpenClicked();
public:
  B * b;
}

void A::connectSignalsSlots()
{
  connect(b->pBtnOpen, SIGNAL(clicked()), this, SLOT(onBtnOpenClicked()));
}
void A::onBtnOpenClicked()
{
  //...
}

第一个方法比第二个方法多一步信号与槽的处理操作,但是第一个方法更能直观的表现控件与类的关系。
上面两个方法用哪种比较好?

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-04-18 09:25
    关注

    引自免费微信小程序:皆我百晓生

    在 Qt 中,选择合适的信号槽连接方式取决于具体的应用场景和个人偏好。下面我会对两种方法进行详细的分析,并提供推荐。

    方法一:

    这种方法的优点在于将事件处理逻辑封装在各自的类中,保持了类的内聚性。按钮的点击事件首先触发子窗口类(B)的槽函数,然后通过发射信号传递给父窗口类(A)。这种方式清晰地展示了层次结构,有利于维护和理解代码。如果你的程序有多个组件之间需要通信,且这些组件可能被复用到不同的上下文中,这种方法会更有优势。

    示例代码:

    // ... (之前的代码不变)
    

    方法二:

    这种方法更加直接,省去了额外的信号发射步骤。直接在主窗口类(A)中连接子窗口类(B)的按钮槽,简化了连接过程。如果应用较小,或者你认为这样更简洁明了,这可能是更好的选择。然而,当组件之间的关系变得复杂,或者需要重用组件时,这种方法可能会导致代码难以理解和维护。

    示例代码:

    // ... (之前的代码不变)
    

    建议:

    通常情况下,我倾向于推荐使用 方法一。尽管它需要额外的信号发射步骤,但这样的设计有助于保持代码的模块化和可维护性。特别是当项目规模增大,团队协作时,明确的职责划分可以使代码更易于理解、测试和扩展。

    当然,这只是一个建议,实际选择应根据你的项目需求、团队规范以及个人编程风格来决定。如果项目简单,功能单一,方法二也未尝不可。重要的是确保代码清晰易懂,符合团队的编码标准。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月26日
  • 已采纳回答 4月18日
  • 创建了问题 4月18日