您尚未登录。

楼主 #1 2020-05-16 10:45:24

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

请教,信号与槽连接,编译报错。

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)

离线

楼主 #3 2020-05-16 11:24:09

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

信号声明:

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)

离线

楼主 #4 2020-05-16 11:28:17

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

cgpsky 说:

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);

离线

楼主 #6 2020-05-16 11:32:19

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

cgpsky 说:

public:
    void canRecv(QVariant varCanRecv); 你这 都不是槽

qt5不用slot修饰了吧?

离线

楼主 #8 2020-05-16 14:32:21

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

connect(nuvotonCan->canRecvThread, &CanRecvThread::canReceived, canRecvSend, &CanRecvSend::canRecv);

nuvotonCan, canRecvThread, canRecvSend,这些都是指针,所以第一个和第三个参数都不用加&运算符了。

离线

楼主 #9 2020-05-16 14:37:05

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

还有新的问题,编译了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)

离线

楼主 #10 2020-05-16 17:10:33

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

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)

离线

楼主 #12 2020-05-16 17:49:34

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

cgpsky 说:

首先 你想一想,不用slot申明,普通函数就能成为槽了,那岂不是普通函数就是槽函数?多想想
下面的问题,我在外面,回去在搞

在qt5里,可以这么搞的。

现在的问题是信号的问题,可能是发送对象的问题。

离线

楼主 #13 2020-05-18 10:34:09

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,363
积分: 1323.5

Re: 请教,信号与槽连接,编译报错。

canRecvThread = new CanRecvThread(canSocket);

找到问题了,canRecvThread对象的初始化,有两个地方有,其中一个应该删掉或屏蔽掉,给忘了。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn