• Qt5 connect 重载信号和槽


    转载文章超哥的经验之谈---Qt5 connect使用之“重载信号和槽”

    Qt4中,关联信号与槽是要使用到SIGNAL()SLOT()这两个宏。

    QLabel *label = new QLabel;
    QScrollBar *scrollBar = new QScrollBar;
    QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                     label,  SLOT(setNum(int)));
    

    但是Qt5中更改了写法

    QLabel *label = new QLabel;
    QLineEdit *lineEdit = new QLineEdit;
    QObject::connect(lineEdit, &QLineEdit::textChanged,
                     label,  &QLabel::setText);
    

    上面两种写法都是没有任何问题,都可以实现关联信号和槽。

    Qt4中,因为是会制定信号和槽的参数类型,所以就不会发生不知道调用哪个槽或者信号的问题,但是在Qt5中,如果你遇到了重载的信号或者是槽,该如何指定想要调用的信号或者槽呢?

    比如QComboBox这个类,这是别人举例的这个,我写下这个的时候,这个类的信号没有这个重载了。

    这是之前的:

    void QComboBox::currentIndexChanged(const QString &text)
    
    void QComboBox::currentIndexChanged(int index)
    

    Qt5.15.2的时候已经改变了,我个人觉得,这个可能是官方有意避免这种重载的写法。

    QComboBox Class : Signals

    void activated(int index)
    void currentIndexChanged(int index)
    void currentTextChanged(const QString &text)
    void editTextChanged(const QString &text)
    void highlighted(int index)
    void textActivated(const QString &text)
    void textHighlighted(const QString &text)

    QComboBox::currentIndexChanged 信号有以上两种重载, 分别参数为字符串类型和整型。
    下面以字符串类型参数为例:

    auto *comboBox = new QComboBox;
    auto *label    = new QLabel;
    
    // ① 基于字符串匹配 connect
    connect(comboBox, SIGNAL(currentIndexChanged(const QString&)),
        label, SLOT(setText(const QString&)));
    
    // ② 基于方法地址匹配 connect. 使用 static_cast 实现
    connect(comboBox,
        static_cast<void(QComboBox::*)(const QString&)>(&QComboBox::currentIndexChanged),
        label, &QLabel::setText);
    
    // ③ 基于方法地址匹配 connect, 使用 方法地址 实现
    void(QComboBox::*curChangeSiganl)(const QString&) = &QComboBox::currentIndexChanged;
    connect(comboBox, curChangeSiganl, label, &QLabel::setText);
    

    除了以上三种实现方式, Qt 也有自己的实现方式: qOverload

    // ④ 基于方法地址匹配 connect, 使用 QOverload 实现
    connect(comboBox, QOverload<const QString&>::of(&QComboBox::currentIndexChanged),
        label, &QLabel::setText);
    
    // ⑤ 基于方法地址匹配 connect, 使用 qOverload 实现. 需要 支持 C++14
    connect(comboBox, qOverload<const QString&>(&QComboBox::currentIndexChanged),
        label, &QLabel::setText);
    

    qOverload

    上面的案例 ④⑤ 是qOverload的基础语法使用。
    qOverload 的作用是返回重载函数的指针,模板参数为函数类型列表

    struct Foo {
        void overloadedFunction();
        void overloadedFunction(int, const QString &);
        void overloadedFunction(int, const QString &) const;
    };
    ... qOverload<>(&Foo::overloadedFunction)
    ... qOverload<int, const QString &>(&Foo::overloadedFunction)
    

    针对const 重载, 可以使用**qConstOverloadqNonConstOverload**

    ... qConstOverload<int, const QString &>(&Foo::overloadedFunction)
    ... qNonConstOverload<int, const QString &>(&Foo::overloadedFunction)
    

    qOverload 需要 C++14 支持. 针对 C++11, 可以使用 QOverloadQConstOverloadQNonConstOverload 辅助类

    ... QOverload<>::of(&Foo::overloadedFunction)
    ... QOverload<int, const QString &>::of(&Foo::overloadedFunction)
    
    ... QConstOverload<int, const QString &>::of(&Foo::overloadedFunction)
    ... QNonConstOverload<int, const QString &>::of(&Foo::overloadedFunction)
    
  • 相关阅读:
    Codeforces 405E DFS
    Codeforces 433C #248_div1_A 中位数的应用
    UVALive 4487 Exclusive-OR 加权并查集神题
    Codeforces 442A Borya and Hanabi
    人工智能:实现人工智能是是不可能的吗?
    关于kinect开发的网址
    jsp笔记(1)
    关于Kinect音频开发的探究
    windows10添加电源计划修改的快捷方案
    关于 kinect 的开发
  • 原文地址:https://www.cnblogs.com/hokori/p/15351587.html
Copyright © 2020-2023  润新知