Qt:自定义信号,信号emit,传参问题,信号槽与moc

一、自定义信号,信号emit

1、自定义信号

在头文件中 加入signals: 就可以编写信号
在这里插入图片描述

2、emit

emit的作用是通知信号发生

二、跨UI控件传参

在这里插入图片描述
每次按Dialog添加按钮主控件数字会增长

// .h
private slots:
    void on_btnAdd_clicked();
signals:
    void sign_add(int value);
-----------------------------------------------
//.cpp
void setDialog::on_btnAdd_clicked()
{
   
    static int num = 1;
    emit sign_add(num++);
}

//.h
private slots:
    void on_btnOpen_clicked();
    void addnum(int value);
------------------------------------------------
//.cpp
void Widget::on_btnOpen_clicked()
{
   
    setDialog d;
    connect(&d,&setDialog::sign_add,this,&Widget::addnum);
    d.exec();
}

void Widget::addnum(int value)
{
   
    qDebug()<<value;
    ui->lineEdit->setText(QString::number(value));
}

三、跨线程之间传参修改控件


子线程自动后台添加数字

//.h
#include <QThread>

class XThread : public QThread
{
   
   Q_OBJECT

public:
    XThread();
signals:
    void sign_send(int value);
private:
    void run() override;//重载 QThread 多线程基类 源码中run为虚函数
};
------------------------------------------------------------------
//.cpp
void XThread::run()
{
   
    static int num = 0;
    while(true)
    {
   
        emit XThread::sign_send(num++);
        XThread::msleep(200);
    }
}
//.cpp
void Widget::on_btnOpen_clicked()
{
   
    XThread *th = new XThread();
    connect(th,&XThread::sign_send,this,&Widget::addnum);
    th->start();
}

四、槽函数的参数和信号参数的关系

Qt槽函数的参数需要和信号函数保持一致,可以比信号函数的参数少,但是不能顺序不同,也不能比信号函数的参数多。

五、解决信号重载问题

在这里插入图片描述

1、Qt4写法

connect(th,SIGNAL(sign_send(int)),this,SLOT(addnum(int)));

2、泛型写法

    connect(th,QOverload<int>::of(&XThread::sign_send),this,&Widget::addnum);

六、Qt信号槽与moc

moc全称是 Meta-0bject Compiler,也就是“元对象编译器”。Qt程序在交由标准编译器编译之前,先要使用moc分析C++源文件。如果它发现在一个头文件中包含了宏Q_OBJECT,则会生成另外一个C++源文件,这个源文件中包含了Q_OBJECT宏的实现代码,这个新的文件名字将会是原文件名前面加上moc构成,这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc的执行是在预理器之前。因为预处理器执行之后,Q_OBJECT宏就不存在了。
通俗来讲,就是moc把Qt中的一些不是C++的关键字做了解析,让C++的编译器在编译的过程中认识Qt中的关键字。
在这里插入图片描述
配置好环境后 ,在终端运行moc指令
在这里插入图片描述
生成的C++文件会在C++编译过程中链接到二进制文件中

相关推荐

  1. qt:使用信号机制

    2024-02-16 09:54:01       41 阅读
  2. Qt5定义信号的实现方式

    2024-02-16 09:54:01       16 阅读
  3. QT定义信号

    2024-02-16 09:54:01       28 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-16 09:54:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-16 09:54:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-16 09:54:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-16 09:54:01       18 阅读

热门阅读

  1. QT-通信编码格式问题

    2024-02-16 09:54:01       29 阅读
  2. 面向对象和面向过程

    2024-02-16 09:54:01       31 阅读
  3. oracle dbms_job 写法

    2024-02-16 09:54:01       29 阅读
  4. Transformer?

    2024-02-16 09:54:01       26 阅读
  5. 程序员为什么不喜欢关电脑?

    2024-02-16 09:54:01       30 阅读
  6. c# linq 查询

    2024-02-16 09:54:01       25 阅读
  7. Spark中多分区写文件前可以不排序么

    2024-02-16 09:54:01       34 阅读
  8. Vue插槽

    Vue插槽

    2024-02-16 09:54:01      23 阅读