信号和槽的三种关联方式

connect关联

Qt5之前:
connect(sender, SIGNAL(signal), receiver, SLOT(slot));
Qt5开始:
connect(sender, &Sender::signal, receiver, &Receiver::slot);
前者:sender和receiver是指向QObject的指针,signal和slot是不带参数的函数名。
SIGNAL()宏和SLOT()宏会把他们的参数转换成相应的字符串。
后者:(1)编译器,检查信号与槽是否存在,参数类型检查,Q_OBJECT宏是否存在(2)信号可以和普通函数、的普通成员函数、lambda函数连接(不在局限于信号和槽函数)(3)参数可以是typedef的或者使用不同的namespace specifier(4)可以允许一些自动类型的转换(即信号和槽函数类型不必完全匹配)

在设计模式关联

自动关联

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. #include<QDialog>
  4. Widget::Widget(QWidget *parent) :
  5. QWidget(parent),
  6. ui(new Ui::Widget)
  7. {
  8. ui->setupUi(this);
  9. //QDialog dialog(this);
  10. //非模态对话框
  11. //QDialog* dialog = new QDialog(this);
  12. //dialog->show();
  13. //模态对话框1
  14. //QDialog dialog(this);
  15. //dialog.exec();
  16. //模态对话框2
  17. //QDialog* dialog = new QDialog(this);
  18. //dialog->setModal(true);
  19. //dialog->show();
  20. //在构造函数中,this代表当前正在被构建的对象地址
  21. //connect关联
  22. connect(ui->showChildButton,&QPushButton::clicked,this,&Widget::showchildDialog);
  23. }
  24. Widget::~Widget()
  25. {
  26. delete ui;
  27. }
  28. void Widget::showchildDialog()
  29. {
  30. QDialog* dialog = new QDialog(this);
  31. dialog->show();
  32. }
  33. //on_发送信号的对象名_信号函数名
  34. //void Widget::on_showChildButton_clicked()
  35. //{
  36. // QDialog* dialog =new QDialog(this);
  37. // dialog->show();
  38. //}