connect(&nuvotonCan->canRecvThread, &CanRecvThread::canReceived, &canRecvSend, &CanRecvSend::canRecv);
在NuvotonCan这个类里,创建了自定义的线程类CanRecvThread。
在MainWindow类里,想将nuvotonCan对象里的canRecvThread对象的canReceived信号,连接到canRecvSend对象的canRecv槽函数。
报错:
../mainwindow.cpp: 在构造函数‘MainWindow::MainWindow(QWidget*)’中:
../mainwindow.cpp:30:104: 错误:对‘MainWindow::connect(CanRecvThread*&, void (CanRecvThread::*)(QVariant), CanRecvSend**, void (CanRecvSend::*)(QVariant))’的调用没有匹配的函数
connect(nuvotonCan->canRecvThread, &CanRecvThread::canReceived, &canRecvSend, &CanRecvSend::canRecv);
^
../mainwindow.cpp:30:104: 附注:备选是:
最近编辑记录 Gentlepig (2020-05-16 10:48:03)
离线
canRe
最近编辑记录 cgpsky (2020-05-16 11:28:26)
离线
信号声明:
class CanRecvThread : public QThread
{
Q_OBJECT
...
signals:
void canReceived(QVariant varCanRecv);
};
槽函数声明:
class CanRecvSend : public QTableWidget
{
public:
CanRecvSend(QWidget *parent = nullptr);
~CanRecvSend();
public:
void canRecv(QVariant varCanRecv);
}
槽函数定义:
void CanRecvSend::canRecv(QVariant varCanRecv)
{
struct can_frame canRecvFrame;
canRecvFrame = varCanRecv.value<struct can_frame>();
qDebug() << canRecvFrame.can_id << endl;
qDebug() << "canrecvsend received a frame.\n" << endl;
}
最近编辑记录 Gentlepig (2020-05-16 11:26:08)
离线
nuvotonCan->canRecvThread 如果是对象 需要取地址
改成这样:
connect(&nuvotonCan->canRecvThread, &CanRecvThread::canReceived, &canRecvSend, &CanRecvSend::canRecv);
仍然报错:
错误:对‘MainWindow::connect(CanRecvThread**, void (CanRecvThread::*)(QVariant), CanRecvSend**, void (CanRecvSend::*)(QVariant))’的调用没有匹配的函数
connect(&nuvotonCan->canRecvThread, &CanRecvThread::canReceived, &canRecvSend, &CanRecvSend::canRecv);
离线
public:
void canRecv(QVariant varCanRecv); 你这 都不是槽
最近编辑记录 cgpsky (2020-05-16 11:29:57)
离线
public:
void canRecv(QVariant varCanRecv); 你这 都不是槽
qt5不用slot修饰了吧?
离线
connect(nuvotonCan->canRecvThread, &CanRecvThread::canReceived, canRecvSend, &CanRecvSend::canRecv);
nuvotonCan, canRecvThread, canRecvSend,这些都是指针,所以第一个和第三个参数都不用加&运算符了。
离线
还有新的问题,编译了2个版本,pc版的和arm版的。
pc版到时可以运行界面。
而arm板的,一运行就报:Segmentation fault , 并退出程序。
屏蔽这个connect()函数就没事。
-----------------------------------
这是搜索可能造成Segmentation fault的原因:
(1)错误的访问类型引起
(2)访问了不属于进程地址空间的内存
(3)访问了不存在的内存
(4)内存越界,数组越界,变量类型不一致等
(5)试图把一个整数按照字符串的方式输出
(6)栈溢出了,有时SIGSEGV,有时却啥都没发生
--------------------------------------
将槽函数里的内容全部屏蔽掉,有时候能运行到显示界面,但有提示:QObject::connect: invalid null parameter 。大部分情况下还是:Segmentation fault 并退出程序。
--------------------------------------
尝试将信号改为一个按钮,结果下载到板子上可以运行,点击按钮,槽函数也可以正常触发。
connect(nuvotonCan->btnCanPort, &QPushButton::clicked, canRecvSend, &CanRecvSend::canRecv);
那么就是信号发送端的问题了,一个可能是发送信号的对象有问题,一个可能是信号有问题。
发送信号的对象是个线程对象,是不是这里有问题?
-----------------------------------------
尝试只连接信号和槽,屏蔽信号发射语句,结果问题依旧。
最近编辑记录 Gentlepig (2020-05-16 15:54:49)
离线
canRecvThread这个对象并没有在nuvotonCan对象初始化时初始化,而是在打开按钮点击时才初始化。
修改了下,将canRecvThread对象初始化放到了NuvotonCan类的构造函数里,编译运行不报错了。
不过奇怪的是,槽函数好像没有被调用,我在槽函数里添加的qDebug()语句没有输出信息到控制台。
---------------------------------------------------
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
connect(nuvotonCan->canRecvThread, &CanRecvThread::canReceived, canRecvSend, &CanRecvSend::canRecv);
connect(nuvotonCan->canRecvThread, &CanRecvThread::canReceived, this, &MainWindow::slottest);
}
void MainWindow::slottest(QVariant var)
{
qDebug() << "slot is ok." << endl;
}
又连接这个信号到另一个槽函数里,结果槽函数仍没触发。之前试过用其他的按钮点击触发槽函数,是没问题的。感觉像是信号没有发送成功。
void CanRecvThread::run()
{
...
qDebug() << "can recv thread run." << endl;
while(1)
{
...
varCanRecv.setValue(Rx_frame);
emit canReceived(varCanRecv);
qDebug() << "emit canReceived." << endl;
}
}
}
最近编辑记录 Gentlepig (2020-05-16 17:26:38)
离线
首先 你想一想,不用slot申明,普通函数就能成为槽了,那岂不是普通函数就是槽函数?多想想
下面的问题,我在外面,回去在搞
最近编辑记录 cgpsky (2020-05-16 17:44:43)
离线
首先 你想一想,不用slot申明,普通函数就能成为槽了,那岂不是普通函数就是槽函数?多想想
下面的问题,我在外面,回去在搞
在qt5里,可以这么搞的。
现在的问题是信号的问题,可能是发送对象的问题。
离线
canRecvThread = new CanRecvThread(canSocket);
找到问题了,canRecvThread对象的初始化,有两个地方有,其中一个应该删掉或屏蔽掉,给忘了。
离线