QT 信号与槽

QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

        创建从发送方对象中的信号到接收方对象中的方法的给定类型的连接。返回连接的句柄,该句柄可用于以后断开连接。

        指定信号和方法时,必须使用SIGNAL()和SLOT()宏,例如:

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

        此示例确保标签始终显示当前滚动条值。请注意,signal和slots参数不能包含任何变量名,只能包含类型。例如,以下操作不起作用,返回false: 

// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                 label, SLOT(setNum(int value)));

         一个信号也可以连接到另一个信号:

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    MyWidget();

signals:
    void buttonClicked();

private:
    QPushButton *myButton;
};

MyWidget::MyWidget()
{
    myButton = new QPushButton(this);
    connect(myButton, SIGNAL(clicked()),
            this, SIGNAL(buttonClicked()));
}

        在本例中,MyWidget构造函数中继来自私有成员变量的信号,并使其以与MyWidget相关的名称可用。

        一个信号可以连接到许多槽和信号。许多信号可以连接到一个槽。

        如果一个信号连接到多个插槽,则在发出信号时,这些插槽将按照与连接相同的顺序激活。

        如果函数成功将信号连接到插槽,则返回QMetaObject::Connection,该连接表示连接的句柄。如果无法创建连接,连接句柄将无效,例如,如果QObject无法验证信号或方法的存在,或者它们的签名不兼容。您可以通过将句柄强制转换为布尔来检查它是否有效。

        默认情况下,每次连接都会发出一个信号;针对重复连接发射两个信号。您可以通过一个disconnect()调用断开所有这些连接。如果传递Qt::UniqueConnection类型,则只有在不重复的情况下才会建立连接。如果已经存在重复(完全相同的信号到相同对象上完全相同的插槽),则连接将失败,并且连接将返回无效的QMetaObject::connection。

注意:Qt::UniqueConnections不适用于lambdas、非成员函数和 functors;它们仅适用于连接到成员函数。

        可选的类型参数描述了要建立的连接的类型。特别地,它确定特定信号是立即传送到时隙还是排队等待稍后传送。如果信号排队,则参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将其存储在幕后事件中。如果您尝试使用排队连接并获得错误消息 

QObject::connect: Cannot queue arguments of type 'MyType'
(Make sure 'MyType' is registered using qRegisterMetaType().)

        在建立连接之前,调用qRegisterMetaType()来注册数据类型。 

注意:此函数是线程安全的。 

template <typename PointerToMemberFunction, typename Functor> QMetaObject::Connection QObject::connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

        此函数重载connect()。

       创建从sender对象中的信号到functor的连接,并返回该连接的句柄

        该信号必须是在标头中声明为信号的函数。槽函数可以是任何可以连接到信号的函数或functor。如果给定信号的自变量至少与槽函数的自变量一样多,则槽函数可以连接到该信号。信号和槽中相应参数的类型之间必须存在隐式转换。

        例如:

void someFunction();
QPushButton *button = new QPushButton;
QObject::connect(button, &QPushButton::clicked, someFunction);

        也可以使用ambda表达式:

QByteArray page = ...;
QTcpSocket *socket = new QTcpSocket;
socket->connectToHost("qt-project.org", 80);
QObject::connect(socket, &QTcpSocket::connected, [=] () {
        socket->write("GET " + page + "\r\n");
    });

         如果发件人被破坏,连接将自动断开。但是,您应该注意,在发出信号时,functor中使用的任何对象仍然是活动的。

        因此,建议使用connect()的重载,该重载还将QObject作为接收器/上下文。可以通过定义QT_NO_CONTEXTLESS_CONNECT宏来禁用无上下文重载的使用。

        重载的函数可以在qOverload的帮助下解决。

        注意:此函数是线程安全的。

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值