没有 SLOT 宏的 Qt 连接

Posted

技术标签:

【中文标题】没有 SLOT 宏的 Qt 连接【英文标题】:Qt connect without SLOT macro 【发布时间】:2014-04-18 18:18:15 【问题描述】:

假设我有一个包含“function()”的字符串,其中 function() 是类中的一个插槽,我想将该插槽与任何信号连接,但使用该字符串。都没有

QString f="function()";
connect (randomobject, SIGNAL(randomsignal()), this, SLOT(f));

output: just says that slot f doesn't exist.

QString f="SLOT(function())";
//conversion to const char*
connect (randomobject, SIGNAL(randomsignal()), this, f);
output: Use the SLOT or SIGNAL macro to connect 

工作。

有没有办法做类似的事情?重要的是它是一个字符串而不是函数指针。

【问题讨论】:

你检查SLOT宏的实现了吗? 您遇到的错误是什么? 是的,我做到了,而且我知道 SLOT 基本上将括号中的内容转换为字符串。我用输出更新了答案。 我不知道你为什么要这样...SLOT是一个宏“在代码的实际编译开始之前和任何代码由常规语句实际生成之前,它们由预处理器检查" 我不认为你将能够从字符串中调用宏......为什么不只是函数指针而不是 F 是一个字符串?! 对话框中有一系列插槽,选择一个后返回一个字符串。之后我可以使用函数指针的唯一方法是检查每个返回值并使用函数指针连接该值。 【参考方案1】:

您可以在 qobjectdefs.h 中查看 SLOT 的定义:

#ifndef QT_NO_DEBUG
# define SLOT(a)     qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)
#else
# define SLOT(a)     "1"#a
# define SIGNAL(a)   "2"#a
#endif

这意味着 SLOT("func()") 在预处理后简单地转换为 "1func()"。 所以你可以写:

Test *t = new Test; // 'Test' class has slot void func()
QString str = "func()";

QPushButton *b = new QPushButton("pressme");
QObject::connect(b, SIGNAL(clicked()), t, QString("1" + str).toLatin1()); // toLatin1 converts QString to QByteArray

当您显示按钮并按下它时,将调用来自 Test 的 slot func()。

请注意,'connect' 将 'const char *' 作为第二个和第四个参数类型,因此您必须将 QString 转换为 'const char *' 或 'QByteArray'(将转换为 char 指针)。

【讨论】:

这个答案泄露了指针,即: QPushButton *b = new QPushButton("pressme");没有父级,Test 类也没有父级,也没有智能指针。 @Ipapp 尽管我不得不说虽然不完整(作者从未提到他提供了一个完整的示例),但您可以很高兴地添加缺失的部分,它说明了关于 OP 是如何工作的问。

以上是关于没有 SLOT 宏的 Qt 连接的主要内容,如果未能解决你的问题,请参考以下文章

QT 用比 SLOT 更少的参数连接一个 SIGNAL

Qt DBus 连接不使用 SLOT 参数中的 typedef

关于QT中的signal 和 slot 中带参数问题

QT信号槽连接语法总结

在Qt中同一个程序中,两个界面如何连接,点一下按钮,另一个界面弹出来,哪里的程序写在哪里。怎么调用。

Qt学习