• Qt 中 connect 函数实现信号与槽函数的连接


    简介:

    Qt 是一个功能强大的跨平台应用程序开发框架,其提供了 connect 函数用于信号和槽的连接,实现了对象之间的通信。本文将介绍 connect 函数的使用方法,包括函数原型和代码示例,旨在帮助入门者快速上手。

    connect 函数原型:

    bool QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *slot, Qt::ConnectionType type = Qt::AutoConnection);
    
    • 1

    参数说明:

    sender: 发送信号的对象。
    signal: 发送信号的成员函数的签名,使用字符串表示。例如,“clicked()” 表示无参数的 clicked 信号,“valueChanged(int)” 表示带一个整型参数的 valueChanged 信号。
    receiver: 接收信号的对象。
    slot: 接收信号的成员函数的签名,使用字符串表示。与 signal 参数的格式相同。
    type: 连接类型,指定了连接的行为。常用的类型有 Qt::AutoConnection(根据当前上下文自动选择连接类型)、Qt::DirectConnection(直接连接)、Qt::QueuedConnection(在接收者所属线程的事件循环中执行槽函数)等。

    代码示例:

    
    #include 
    #include 
    #include 
    
    class MyObject : public QObject
    {
        Q_OBJECT
    public slots:
        void onButtonClicked()
        {
            qDebug() << "Button clicked!";
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        
        QPushButton button("Click me");
        MyObject receiver;
        
        // 连接按钮的 clicked 信号到接收者的 onButtonClicked 槽函数
        QObject::connect(&button, SIGNAL(clicked()), &receiver, SLOT(onButtonClicked()));
        
        button.show();
        
        return app.exec();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在上面的示例中,我们创建了一个 QPushButton 对象和一个自定义的 MyObject 对象。使用 connect 函数将按钮的 clicked 信号连接到接收者的 onButtonClicked 槽函数上。当按钮被点击时,onButtonClicked 槽函数会被触发,输出"Button clicked!"。

    自定义信号和槽函数

    首先,在类的头文件中声明自定义信号和槽函数:

    class MyClass : public QObject
    {
        Q_OBJECT
    public:
        explicit MyClass(QObject *parent = nullptr);
    
    signals:
        void mySignal(int value);
    
    public slots:
        void mySlot(int value);
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在源文件中实现自定义信号和槽函数:

    MyClass::MyClass(QObject *parent) : QObject(parent)
    {
        // Constructor
    }
    
    void MyClass::mySlot(int value)
    {
        qDebug() << "Received value in slot:" << value;
        // Slot function implementation
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    #连接自定义信号和槽函数:

    MyClass *obj = new MyClass();
    QObject::connect(obj, SIGNAL(mySignal(int)), obj, SLOT(mySlot(int)));
    
    • 1
    • 2

    在上述示例中,我们首先声明了MyClass中的自定义信号mySignal和槽函数mySlot。然后,我们使用QObject::connect()函数将信号和槽函数进行连接。在connect()函数中,我们指定了信号和槽函数的对象,以及信号和槽函数的名称。

    这样,当mySignal信号被发射时,与之连接的mySlot槽函数将被调用,并传递相应的参数。

    请注意,为了使用自定义信号和槽函数,您需要在类的头文件中使用Q_OBJECT宏进行声明,并确保类继承自QObject。

    这是一个基本的使用自定义信号和槽函数的示例,您可以根据具体的需求进行适当的扩展和修改。

    信号和槽函数的线程安全性

    在多线程应用程序中,使用信号和槽函数进行跨线程通信是一种常见的做法。Qt提供了线程安全的信号和槽函数机制,确保信号的发射和槽函数的调用在正确的线程中执行。

    当涉及到线程间的信号和槽函数连接时,需要确保对象的生命周期和线程关联。可以使用QObject::moveToThread()函数将对象移到特定的线程中,从而确保信号和槽函数在同一线程中执行。

    另外,Qt还提供了一些线程间通信的辅助类,例如QThread、QtConcurrent和QThreadPool等,可以根据具体的需求选择适当的方式进行线程间通信。

    总结:

    通过 connect 函数,我们可以轻松实现信号和槽的连接,实现对象之间的通信。希望本文提供的函数原型和代码示例能够帮助入门者快速理解 connect 函数的使用方法。随着进一步的学习和实践,您将能够更好地掌握 Qt 的信号和槽机制,为应用程序开发提供更强大的功能和灵活性。

  • 相关阅读:
    QT基础第二天(2)qt基础部件:按钮类,布局类,输出类,输入类,容器等个别举例
    AI学习指南数学工具篇-PCA基础知识
    VTK旋转、平移、缩放
    C 语言 sizeof运算符
    FPGA常用通信协议 —UART(二)---UART接收
    OpenP2P实现内网穿透远程办公
    圆方树 useful things
    spring 事务的传播行为
    被裁员一个月后,我被面试官的一套性能优化面试题给问自闭了
    如何使用pywinauto打开Windows上指定的应用程序
  • 原文地址:https://blog.csdn.net/qq_46017342/article/details/130905080