Skip to content
On this page

QT_信号与槽


标签:CPP/QT  

QT 信号与槽


  • 信号不用定义,只须在组件中声明
  • 信号放在类的 signals: 权限下面
  • 信号触发使用 emit 关键字
  • 信号触发可以传入数据,在对应的槽函数中接收,槽函数的声明需要中需要带上对应的数据,例如 emit call(foo);
  • 信号与槽的连接一般格式是(发送者,发送者的信号,接收者,接收者的槽函数),具体几种类型看下面
  • 槽函数如果在外部使用,需要放在 public slots: 权限下;只是内部使用,比如处理组件内按钮点击信号的槽函数,只须放在 private slots: 权限下。

信号与槽的连接

1> 使用 UI 界面信号与槽工具栏进行连接,这种方法只能连接系统提供的信号函数和槽函数

2> 通过组件右键菜单中的转到槽,跳转对应槽函数,仅限于系统系统提供的信号函数,但槽函数可自己实现,连接过程由系统实现

3> QT4 版本手动连接信号与槽 (connect)

cpp
/*static*/ QMateObject::Connection
QObject::connect(
  const QObject *sender,     // 信号发射者
  const char *signal,        // 发射的信号, 信号函数名本质上是函数指针, 
                             // 此处需要使用 SIGNAL()
  const QObject *receiver,   // 信号的接收者
  const char *method,        // 接收后处理的槽函数
  Qt::ConnectionType type = Qt::AutoConnection 
)
cpp
connect(ui->btn3, SIGNAL(clicked()), this, SLOT(my_slot()));

4> QT5 版本的连接

  • QMetaObject::connection()
cpp
[static] QMetaObject::Connection            //返回一个连接,是静态成员函数
QObject::connect(                     //函数名
    const QObject *sender,            //信号发射者
    PointerToMemberFunction signal,     //信号函数的地址
    const QObject *receiver,           //信号接受者
    PointerToMemberFunction method)      //槽函数的地址
cpp
QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
QObject::connect(lineEdit, &QLineEdit::textChanged,
                 label,  &QLabel::setText);

5> C++11 后的新连接,将信号连接到仿函数(Lambda表达式作为槽函数)中

cpp
[static] QMetaObject::Connection              //返回值类型  是一个静态成员函数
QObject::connect(                     //函数名
    const QObject *sender,            //信号发射者
    PointerToMemberFunction signal,   //发射的信号
    Functor functor)                  //接受信号后处理的函数
cpp
QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
                 socket->write("GET " + page + "\r\n");
});

Last updated: