QT信槽编程,QObject::connect: Cannot connect (null)报错的两种成因

{	
	connect(
		ui.btnHelp, SIGNAL(clicked()), this, SLOT(OnBtnHelp())
		);
	connect(
		ui.btnHelp, SIGNAL(toggled(bool)), this, SLOT(OnBtnHelpChanged(bool))
		);
	ui.setupUi(this);
}

上面这段代码报错如下:

QObject::connect: Cannot connect (null)::clicked() to Test5_4::OnBtnHelp()
QObject::connect: Cannot connect (null)::toggled(bool) to Test5_4::OnBtnHelpChanged(bool)
这是ui没有被提前初始化的原因,把最后一段代码前置就可以了,原因是:(quote自http://blog.csdn.net/oowgsoo/article/details/1529411#comments)

即编译器未能识别到信号发送者,sender为零时,报错NULL。

 // 不允许空输入
    if (sender == 0 || receiver == 0 || signal == 0 || method == 0) {
#ifndef QT_NO_DEBUG
        qWarning("Object::connect: Cannot connect %s::%s to %s::%s",
                 sender ? sender->metaObject()->className() : "(null)",
                 signal ? signal+1 : "(null)",
                 receiver ? receiver->metaObject()->className() : "(null)",
                 method ? method+1 : "(null)");
#endif
        return false;
    }
发送和接收者定义重叠,也会保类似错误,详见:

http://stackoverflow.com/questions/8493506/qobjectconnect-cannot-connect-null



                
`QObject::connect` 是 Qt 框架中用于信号(signals and slots)机制的函数,它允许对象间的通信。当你需要将一个对象的信号(signal)与另一个对象的(slot)连接起来时,就会使用到 `QObject::connect`。信号是一种高级的事件处理机制,用于在不同的对象或同一对象内的不同部分之间进行事件传递。 在 Qt 中,当一个事件发生时,比如按钮被点击,该事件所在的对象会发出一个信号。这个信号可以被连接到一个或多个上,当信号发出时,所有连接到该信号都会被调用。 下面是一个 `QObject::connect` 的基本示例: ```cpp #include <QObject> #include <QDebug> class Communicator : public QObject { Q_OBJECT public: void printMessage(const QString &message) { qDebug() << message; } public slots: void greet(const QString &name) { qDebug() << "Hello," << name << "!"; } }; int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); Communicator comm1, comm2; QObject::connect(&comm1, &Communicator::printMessage, &comm2, &Communicator::greet); comm1.printMessage("World"); return app.exec(); } ``` 在这个例子中,`Communicator` 类有一个 `printMessage` 和一个信号 `greet`。当 `printMessage` 被调用时,它会发出一个信号,并且这个信号被连接到了 `greet` 上。当 `comm1.printMessage("World")` 被执行时,`greet` 会输出 `"Hello, World!"`。 `QObject::connect` 有几个重载版本,可以根据信号的签名来选择使用。下面是一个稍微复杂的例子,展示了一个带有参数的信号和对应的: ```cpp QObject::connect(&comm1, &Communicator::anotherSignal, &comm2, &Communicator::anotherSlot); ``` 这里,`anotherSignal` 是 `Communicator` 类中的一个信号,它可能带有参数,而 `anotherSlot` 是另一个对象中的一个,它也接受相同的参数类型。 当你连接信号时,还需要注意以下几点: - 信号的参数类型必须兼容。 - 信号可以属于不同的类,甚至可以是私有成员。 - 一个信号可以连接到多个上,当信号发出时,所有连接的都会被调用。 - 信号连接后,Qt 内部会自动处理线程间的同步问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值