QT中的槽函数

2023/10/11 C++ 共 1093 字,约 4 分钟
闷骚的程序员

QT中的槽函数

怎么给槽函数传递参数

方法一:信号传递

//Widget.h
signals:
    void signal(int i);
slots:
    void showint(int i);


//widget.cpp
connect(this,&Widget::signal,this,&Widget::showint);
emit:signal(10);


void Widget::showint(int i){
    qDebug()<<i;
}

通过信号来传递参数。

方法二:lambda表达式

//Widget.h
slots:
    void showstr(QString str);


//Widget.cpp
connect(ui->cancel,&QPushButton::clicked,[this](){
        showstr("hello");
    });

void Widget::showstr(QString str){
    qDebug()<<str;
} 

lambda表达式:[capture//捕获变量] (parameters//参数列表) -> return_type//返回值 { function_body }

  1. []:不捕获任何外部变量。
  2. [&]:通过引用捕获所有外部变量。
  3. [=]:通过值捕获所有可命名的外部变量。
  4. [this]:捕获this指针

方法三:std::bind()

    connect(ui->cancel,&QPushButton::clicked,this,
    std::bind(&Widget::showstr,this,"hello"));

std::bind(“成员函数的绑定”,“实例参数的绑定”,“参数的绑定”)

注意:以下写法是错误的

connect(ui->cancel, &QPushButton::clicked, this, std::bind(showstr, "hello"))

因为bind()绑定了一个非静态成员函数,但是没有以对象(因此需传入this)作为参数来调用它,非静态成员函数需要一个类的实例(即对象)来调用,因为它们可以访问类的成员变量和成员函数。

如果槽函数有返回值

省流:可以有,但没用

在Qt中,槽函数(slot)可以有返回值,但在信号(signal)和槽(slot)的机制中,返回值通常不会被使用或传递。通常,信号和槽的设计目的是为了响应特定事件和进行处理,而不是为了返回值。

在处理事件时想要获取某些结果,做法可以为:

  1. 使用类内成员变量

  2. 将计算或处理逻辑放在一个普通函数中,然后在槽函数中调用这个函数。

文档信息

Search

    Table of Contents