zoukankan      html  css  js  c++  java
  • Qt中添加自定义信号和槽带来的一些问题

    • 背景:
      自己定义了一个类,并在类中添加了槽函数
    class XImage : public QWidget
    {
    public:
        XImage(QWidget *p = 0);
        //重载绘制方法 update后会调用
        void paintEvent(QPaintEvent* e);
    
    public slots:
        void openButton_clicked();  //添加的槽函数
    
    protected:
        QImage src;
    };
    
    

    然后建立信号和槽函数的连接

        connect(ui->openButton,
                SIGNAL(clicked()),
                ui->image,
                SLOT(openButton_clicked())
                );
    

    运行程序,Qt Creator提示

    QObject::connect: No such slot QWidget::openButton_clicked() in ..XImageEditwidget.cpp:13
    QObject::connect:  (sender name:   'openButton')
    QObject::connect:  (receiver name: 'image')
    

    也就是说,没办法调用到自己添加的槽函数。

    • 解决
      1 经过查找资料后发现,自己定义的类,如果想要实现信号和槽机制,需要在类中添加Q_OBJECT,添加后再此运行
    class XImage : public QWidget
    {
        Q_OBJECT
    
    public:
        XImage(QWidget *p = 0);
        //重载绘制方法 update后会调用
        void paintEvent(QPaintEvent* e);
    
    public slots:
        void openButton_clicked();  //添加的槽函数
    
    protected:
        QImage src;
    };
    

    这时候,Qt Creator报错

    ximage.obj:-1: error: LNK2001: 无法解析的外部符号 "public: virtual struct QMetaObject const * __thiscall XImage::metaObject(void)const " (?metaObject@XImage@@UBEPBUQMetaObject@@XZ)
    

    这是因为在类中添加了Q_OBJECT后,需要在执行一下qmake才可以。

    • 以下参考自豆子老师的博客《Qt 学习之路 2(5):自定义信号槽》

    只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。因此,如果你觉得你的类不需要使用信号槽,就不添加这个宏,就是错误的。其它很多操作都会依赖于这个宏。注意,这个宏将由 moc(我们会在后面章节中介绍 moc。这里你可以将其理解为一种预处理器,是比 C++ 预处理器更早执行的预处理器。) 做特殊处理,不仅仅是宏展开这么简单

    下面总结一下自定义信号槽需要注意的事项:

    • 发送者和接收者都需要是QObject的子类(当然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
    • 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不需要实现函数代码;
    • 槽函数是普通的成员函数,作为成员函数,会受到 public、private、protected 的影响;
    • 使用 emit 在恰当的位置发送信号;
    • 使用QObject::connect()函数连接信号和槽。
  • 相关阅读:
    PHP 使用 GET 传递数组变量
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/11187652.html
Copyright © 2011-2022 走看看