窗口 class 头文件是这么写的:
Q_DECLARE_METATYPE(std::string)
class A: public QMainWindow
{
Q_OBJECT
A()
{
qRegisterMetaType<std::string>("std::string");
QObject::connect(
this, SIGNAL(tunnel::add_item_into_table_signal(std::string, std::string, std::string)),
this, SLOT(tunnel::add_item_into_table(std::string, std::string, std::string))
);
}
signals:
// 这个函数的实现是由 Qmake 生成的,我能调试单步步进进去,看到实现里的代码跑到了
void add_item_into_table_signal(std::string ip, std::string port, std::string remark);
public slots:
void add_item_into_table(std::string ip, std::string port, std::string remark)
{
DebugBreak(); // 这里跑不到
}
}
已经搞了一天了,我 emit 其他没有参数的信号函数都能跑到 slots,但是这个传了参数的函数就是跑不到 slots。
1
1KN6sAqR0a57no6s 2020-03-05 13:20:12 +08:00
试试 QString 呢
|
2
fyyz OP @YuxiangLuo 我更想知道我哪里不对,因为我看别人连自己的 struct 都能传递过去。
|
3
wbing 2020-03-05 13:36:51 +08:00
把"tunnel::" 去掉试试
|
4
ipwx 2020-03-05 13:36:56 +08:00
@fyyz Qt 的 type 要借助预编译器的吧。。。std::string 真的能被支持么?关键是用了 template。struct 等同于 class,qmake 至少支持 customized class。不过 qmake 对 template 支持极差我记得。
|
5
sc3263 2020-03-05 13:39:22 +08:00
QObject::connect(
this, SIGNAL(tunnel::add_item_into_table_signal(std::string, std::string, std::string)), this, SLOT(tunnel::add_item_into_table(std::string, std::string, std::string)) ); 去掉这边的 tunnel:: 如果还不行的话,调试模式启动,看看 Qt 本身有没有输出类似 QObject::connect: No such signal A::add_item_into_table_signal(std::string, std::string, std::string) in xxx.cpp 的日志 |
6
sc3263 2020-03-05 13:39:47 +08:00
以及。。。2020 年了
|
10
vx2018 2020-03-05 13:46:24 +08:00
QObject::connect(this, &tunnel::add_item_into_table_signal, this, &tunnel::add_item_into_table);
这样不好吗? 非要用 SLOT 和 SIGNAL 宏. |
11
ztcaoll222 2020-03-05 13:51:20 +08:00
我记得信号槽能发的类型是有限制的吧,自定义类要继承 QObject
https://doc.qt.io/qt-5/signalsandslots.html |
12
dbskcnc 2020-03-06 10:12:26 +08:00
完成没问题的,不过需要多做点处理,
以下是正确答案: 一般在 main.cpp 里面加 qRegisterMetaType<std::string>(); |