zoukankan      html  css  js  c++  java
  • 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)
    
  • 相关阅读:
    软件架构设计模式简述
    [翻译]docker生态圈Mindmap
    完美解决Invalid layout of java.lang.String at value问题的方法
    用开源项目JazzyViewPager实现ViewPager切换动画
    用开源项目RangBar来实现有范围的SeekBar
    开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用
    开源项目MultiChoiceAdapter详解(五)——可扩展的MultiChoiceBaseAdapter
    开源项目MultiChoiceAdapter详解(四)——MultiChoiceBaseAdapter的使用
    开源项目MultiChoiceAdapter详解(三)——MulitChoiceNormalArrayAdapter的使用
    开源项目MultiChoiceAdapter详解(二)——MultiChoiceArrayAdapter的使用
  • 原文地址:https://www.cnblogs.com/hokori/p/15351587.html
Copyright © 2011-2022 走看看