一、Qt槽函数四种写法



00:00



1. 第一种Qt4写法



03:30



  • 语法格式:connect(ui->btnOpen, SIGNAL(clicked()), this, SLOT(open()));

  • 历史原因:这是Qt4时期的写法,当时还没有C++11标准

  • 缺点:

    • 使用宏展开方式,编译器无法检查拼写错误

    • 信号或槽函数名写错时不会报错,导致程序无响应

    • 参数写错也无法被编译器发现

  • 现状:一般不推荐使用这种写法

2. 第二种Qt5写法



07:16



  • 语法格式:connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::btnSlot);

  • 改进点:

    • 使用取地址符和类名限定信号和槽

    • 编译器可以检查拼写错误,错误处会显示红色波浪线

    • 参数错误也会被编译器发现

  • 推荐程度:项目中最常用的写法

3. 第三种lambda表达式写法



09:09



  • 语法格式:connect(ui->btnOpen, &QPushButton::clicked, [=](){...});

  • 特点:

    • 适用于槽函数代码较少的逻辑

    • 需要捕获上下文对象(如[=])

    • 不会调用原有的槽函数,直接执行lambda内的代码

  • 使用场景:适合简单逻辑,代码量少的情况

4. 第四种牵线法



10:12



  • 操作方法:

    • 在Qt Designer中选中控件

    • 点击工具栏"Signals & Slots Editor"

    • 连接信号和槽

  • 缺点:

    • 界面控件多时连线混乱

    • 不适合跨线程或跨多层界面通信

    • 维护困难

  • 现状:实际开发中很少使用

5. 第五种命名规则写法
  • 语法规则:on_控件名_信号名()

  • 特点:

    • 函数名必须严格按此格式命名

    • 参数必须与信号保持一致或更少

    • Qt会自动连接这些符合命名规则的槽函数

  • 使用场景:

    • 常用于按钮点击等简单交互

    • 菜单项触发等场景

  • 示例:

    • 按钮点击:on_btnOpen_clicked()

    • 菜单退出:on_actionExit_triggered()

  • 参数规则:

    • 槽函数参数可以比信号参数少

    • 但不能比信号参数多

    • 参数类型必须匹配

  • 错误示例:

    • 信号:triggered(bool)

    • 错误槽:on_actionExit_triggered(int)(参数类型不匹配)

二、知识小结

知识点

核心内容

易混淆点/注意事项

使用频率

Qt4宏展开写法

connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(btn_click()))

宏定义无法检查拼写错误,如SINGLE写成SINGLE_NL仍能编译通过

★☆☆☆☆

Qt5函数指针写法

connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::btn_click)

需使用&类名::信号名语法,编译器可检测参数错误

★★★★★

Lambda表达式写法

connect(ui->pushButton, &QPushButton::clicked, [this](){...})

必须捕获this指针,适合简单逻辑但会破坏代码结构

★★★☆☆

UI设计器可视化连接

通过设计器拖拽信号槽连线

控件多时连线混乱,且不支持跨线程/跨界面通信

★☆☆☆☆

自动连接命名规范

定义on_控件名_信号名()格式函数如on_pushButton_clicked()

必须严格匹配objectName,参数可少于信号参数但类型需一致

★★★★☆

信号槽参数规则

槽函数参数数量≤信号参数

常见错误:添加不存在的参数类型如int会导致连接失败

-

中文编码问题

QMessageBox显示中文需加QStringLiteral(u8"中文")

Qt默认编码易产生乱码,建议优先使用英文

-