QT connect使用简单介绍

在这里插入图片描述
如图,首先 connect是线程安全的。其次它有很多重载,当然最重要的还是QT4连接和QT5连接的区别,这个函数重载表示connect函数也是支持lambda函数的。

connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

connect 函数的第五个参数

在这里插入图片描述
了解 connect的第五个参数是非常重要的。其中Qt::UniqueConnection是比较特殊的,它仅仅用于connect的在两个对象之间一个信号和一个槽之间连接的唯一性。注意 在QT中一个对象的信号重复连接到另外一个对象的槽上,那么当信号发送时,每个连接的槽都会执行。如果只希望连接一次那么就可以使用Qt::UniqueConnection。当出现重复的连接时就会连接失败。问题 如何判断连接是否失败了?答案就是connect的返回值。
在这里插入图片描述
因为QMetaObject::Connection重载了运算符bool所以可以将该类直接用于条件判断。代码如下

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QMetaObject::Connection con = connect(ui->pushButton, &QPushButton::clicked, this, &Widget::slotClicked, Qt::UniqueConnection);
    QMetaObject::Connection con_1 = connect(ui->pushButton, &QPushButton::clicked, this, &Widget::slotClicked, Qt::UniqueConnection);
    if(con_1){
        qDebug() << QStringLiteral("第二次连接成功");
    }else{
        qDebug() << QStringLiteral("第二次连接失败");
    }
}

Widget::~Widget()
{
    delete ui;
}

void Widget::slotClicked()
{
    qDebug() << QStringLiteral("按钮被点击了");
}

这里又可以体现出lambda表达式的坏处。lambda最大的好处就是使用非常方便。不好的地方有使用lambda函数导致调试困难。

    QMetaObject::Connection con = connect(ui->pushButton, &QPushButton::clicked, this, [](){
        qDebug() << QStringLiteral("按钮被点击了");
    }, Qt::UniqueConnection);
    if(con){
        qDebug() << QStringLiteral("con连接成功");
    }else{
        qDebug() << QStringLiteral("con连接失败");
    }
    QMetaObject::Connection con_1 = connect(ui->pushButton, &QPushButton::clicked, this, [](){
        qDebug() << QStringLiteral("按钮被点击了");
    }, Qt::UniqueConnection);
    if(con_1){
        qDebug() << QStringLiteral("con_1连接成功");
    }else{
        qDebug() << QStringLiteral("con_1连接失败");
    }

此时就算两个匿名函数的函数体一样,但是由于名字不一样所以两个都可以连接成功。使用匿名函数导致调试困难
在这里插入图片描述
即使是debug模式仍然不会进入断点。

剩下的四个参数

Qt::AutoConnection 默认就是此链接,如果发送对象和接收对象在同一个线程,那么就是Qt::DirectConnection链接如果不是在同一个线程上那么就是Qt::QueuedConnection
Qt::BlockingQueuedConnectionQt::QueuedConnection相同,不同的是发送信号的线程将会阻塞直到被执行的槽函数返回。如果在同一个线程进行该参数的连接会导致死锁。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt使用DBus连接可以实现不同进程之间的通信。DBus是一个消息总线系统,它允许进程通过发送和接收消息来进行通信。 要在Qt使用DBus连接,首先需要在项目文件(.pro)中添加DBus模块的依赖: ``` QT += dbus ``` 然后,可以使用QDBusConnection类来建立和管理DBus连接。下面是一个简单的示例,展示了如何使用DBus连接两个进程。 进程1(服务端): ```cpp #include <QCoreApplication> #include <QDebug> #include <QDBusConnection> #include <QDBusMessage> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QDBusConnection connection = QDBusConnection::sessionBus(); if (!connection.isConnected()) { qDebug() << "Cannot connect to the D-Bus session bus."; return 1; } // 注册DBus服务 if (!connection.registerService("com.example.MyService")) { qDebug() << "Failed to register service."; return 1; } // 注册DBus对象 if (!connection.registerObject("/com/example/MyObject", &app)) { qDebug() << "Failed to register object."; return 1; } qDebug() << "Service running..."; return app.exec(); } ``` 进程2(客户端): ```cpp #include <QDebug> #include <QCoreApplication> #include <QDBusConnection> #include <QDBusMessage> int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); QDBusConnection connection = QDBusConnection::sessionBus(); if (!connection.isConnected()) { qDebug() << "Cannot connect to the D-Bus session bus."; return 1; } // 创建DBus消息 QDBusMessage message = QDBusMessage::createMethodCall( "com.example.MyService", // 服务名 "/com/example/MyObject", // 对象路径 "com.example.MyInterface", // 接口名 "myMethod" // 方法名 ); // 发送DBus消息并等待回复 QDBusMessage reply = connection.call(message); if (reply.type() == QDBusMessage::ReplyMessage) { qDebug() << "Received reply:" << reply.arguments(); } else { qDebug() << "Failed to call method:" << reply.errorMessage(); } return app.exec(); } ``` 在以上示例中,服务端注册了一个名为"com.example.MyService"的DBus服务,还注册了一个名为"/com/example/MyObject"的DBus对象。客户端通过创建一个DBus消息,并使用QDBusConnection发送该消息到服务端,然后等待回复。 这只是DBus连接的基本用法,你还可以定义自己的DBus接口,并在服务端实现相应的方法。有关更详细的信息,请参考Qt的官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值