QTCreator:类之间的信号槽机制

发布于 2025-02-13 08:27:07 字数 7174 浏览 0 评论 0原文

如果您不从类中制作对象(仅从类中继承),则如何在两个类之间求解信号/插槽机制? Qtimer,QSerialport,哪个是信号的来源,在第二类中,您建立连接?

是这样的方法吗?

就我而言。我有两个类USB2CAN_DRIVER和CANVIEW。 USB2CAN_DRIVER 从QSerialport继承,该QSerialport继承了Qiodevice包含信号(readyRead())。 我知道,这在 Canview 中用于与Handler Subroutine read_u2c()连接,

我知道,在测试中,代码中是很多垃圾。

canview.cpp void canview :: on_connectport_release()中是建立连接的,在 usb2can_driver.cpp int usb2can_driver :::::::: ConnectToport(QString PortName)是QSerialport继承的一部分。

每个答案我都会很高兴。如果您认为这个问题是错误提出的,请给我反馈。

usb2can_driver.h

#ifndef USB2CAN_DRIVER_H
#define USB2CAN_DRIVER_H

#include "QSerialPort"
#include "QTimer"
#include "QObject"
#include "QSignalSpy"


class USB2CAN_driver : public QSerialPort
{
    Q_OBJECT;

public:
    USB2CAN_driver();
    //virtual ~USB2CAN_driver();

    //QSerialPort *port_USB2CAN = new QSerialPort();


    int temporary_init_Counter = 0;
    int init();
    void USB_LoopBack();
    void Boot_Mode();
    void Config_Mode();
    void Normal_Mode();
    void LoopBack_Mode();
    QByteArray Get_Mode();

    void WriteReg(QByteArray regAdress, QByteArray value[]);
    QByteArray WriteCMD(QByteArray CMD_name, QByteArray value);
    QByteArray ReadReg(QByteArray regAdress);

    QString portName;
    int connectToPort(QString portName);
    int disconnectedFromPort();

    QTimer *tim;
    int tim_counter = 0;

public: signals:
    void readyRead();


private slots:
    QByteArray read_USB2CAN();
    void initSend();
    //void timEvent();

};

#endif // USB2CAN_DRIVER_H

usb2can_driver.cpp

#include "USB2CAN_define.h"
#include "QSerialPort"
#include "QSerialPort"
#include "QObject"
#include "QDebug"
#include <QSignalSpy>



USB2CAN_driver::USB2CAN_driver()
{
    //USB2CAN_driver:: = new QSerialPort();
    //USB2CAN_driver::Baud9600;
    //USB2CAN_driver::AllDirections;
    //qDebug() << "Open port" << USB2CAN_driver::open(QIODevice::ReadWrite);
}

/*
USB2CAN_driver::~USB2CAN_driver(){
    QObject::disconnect(USB2CAN_driver::,SIGNAL(readyRead()),USB2CAN_driver::,SLOT(QByteArray read_USB2CAN()));
}
*/

int USB2CAN_driver::connectToPort(QString portName){
    //port_USB2CAN.setPortName(portName);
    USB2CAN_driver::setPortName(portName);
    USB2CAN_driver::setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);
    USB2CAN_driver::setPortName(portName);
    //Reimplemented separately as signal of driver. !!!
    //qDebug() << "connect S&S in the driver, status: " << QObject::connect(this,SIGNAL(readyRead),this,SLOT(read_USB2CAN));
    //qDebug() << "connect S&S in the driver, status: " << connect(this,SIGNAL(readyRead()),this,SLOT(read_USB2CAN()));
    //QSignalSpy spy(this, SIGNAL(readyRead()));
    //qDebug() << "from driver" << spy.wait(5000) << "----" << spy.signal();
    tim = new QTimer;

    return USB2CAN_driver::open(QIODevice::ReadWrite);
}

/*
void USB2CAN_driver::timEvent(){
    qDebug() << "Tim" << tim_counter++;
    if(tim_counter >= 5){
        tim_counter = 0;
        tim->stop();
    }
}
*/

int USB2CAN_driver::disconnectedFromPort(){
    //QObject::disconnect(this,SIGNAL(readyRead()),this,SLOT(read_USB2CAN()));
    USB2CAN_driver::close();
    if(USB2CAN_driver::isOpen()){
        return 1;
    }
    else{
        qDebug() << "------------------Port is diconected-----------------";
        return 0;
    }
}


void USB2CAN_driver::USB_LoopBack(){
}
void USB2CAN_driver::Boot_Mode(){
}
void USB2CAN_driver::Config_Mode(){
}
void USB2CAN_driver::Normal_Mode(){
}
void USB2CAN_driver::LoopBack_Mode(){
}
QByteArray USB2CAN_driver::Get_Mode(){
    while(!USB2CAN_driver::waitForBytesWritten(300)){
        USB2CAN_driver::write(getMode);
    }
    return USB2CAN_driver::readAll(); //In progress...
}

void USB2CAN_driver::WriteReg(QByteArray regAdress, QByteArray value[]){
    int length = regAdress.length() + value->length();
    QByteArray len;
    len.setNum(length);
    QByteArray sendVal[] = { writeReg, len, regAdress, *value };
    QByteArray sendData;
    sendData.fromRawData(*sendVal,sizeof (sendVal));
    while(!USB2CAN_driver::waitForBytesWritten(300)){
        USB2CAN_driver::write(sendData);
    }
}
QByteArray USB2CAN_driver::WriteCMD(QByteArray CMD_name, QByteArray value){
}
QByteArray USB2CAN_driver::ReadReg(QByteArray regAdress){
}

int USB2CAN_driver::init(){
}

QByteArray USB2CAN_driver::read_USB2CAN(){
    qDebug() <<"From driver RX" << USB2CAN_driver::readAll();
    return USB2CAN_driver::readAll();
}

void USB2CAN_driver::initSend(){
}

canview.h

#define CANVIEW_H

#include <QDialog>
#include <usb2can_driver.h>

namespace Ui {
class CANview;
}

class CANview : public QDialog
{
    Q_OBJECT

public:
    explicit CANview(QWidget *parent = nullptr);
    ~CANview();

    USB2CAN_driver *u2c;
    QTimer *time;


private: signals:
    friend void USB2CAN_driver::readyRead();
private slots:
    void on_connectPort_released();

    void on_pushButton_released();

    QByteArray read_u2c();

    void timerSubrutine();

private:
    Ui::CANview *ui;
};

#endif // CANVIEW_H

canview.cpp

#include "ui_canview.h"
#include "QSignalSpy"

CANview::CANview(QWidget *parent) : QDialog(parent),ui(new Ui::CANview)
{
    ui->setupUi(this);
    u2c = new USB2CAN_driver;

}

CANview::~CANview()
{
    delete ui;   
}

//connect fcn
void CANview::on_connectPort_released()
{
    if(u2c->isOpen()){
        u2c->disconnectedFromPort();
    }
    else{
        u2c->connectToPort(ui->inputNamePort->text());
        qDebug() << "Connect rx task, status: " << connect(???,SIGNAL(readyRead()),this,SLOT(read_u2c()));
        connect(u2c->tim,SIGNAL(timeout()),this,SLOT(timerSubrutine()));
        u2c->tim->start(800);

    }

    //Controll of opened/close port
    if(u2c->isOpen()){
        ui->connectPort->setCheckState(Qt::CheckState::Checked);
    }
    else{
        ui->connectPort->setCheckState(Qt::CheckState::Unchecked);
    }
}

//Send function
void CANview::on_pushButton_released()
{
    u2c->write(ui->TX_textBrowser->toPlainText().toLatin1(),static_cast<int>(ui->TX_textBrowser->toPlainText().length()));
    qDebug() << "Send: " << static_cast<int> (ui->TX_textBrowser->toPlainText().length());
    QSignalSpy spy(u2c,SIGNAL(readyRead()));
    qDebug() << spy.signal() << spy.signalsBlocked() << spy.isValid();
}

QByteArray CANview::read_u2c(){
    qDebug() << "RX:" << u2c->readAll();
    ui->RX_textBrowser_2->setPlainText(u2c->readAll());
    return u2c->readAll();
}

void CANview::timerSubrutine(){
    qDebug() << "TimerEvent" << u2c->tim_counter++;
    if(u2c->tim_counter >= 5){
        u2c->tim->stop();
    }
}```

How are you solving signals/slots mechanism between two classes, if you do not make an object from class(only inherit from class) etc? QTimer, QSerialPort, which is the source of SIGNAL, and in the second class you make connection?

Is such an approach even possible?

In my case. I have two classes usb2can_driver and canview. The usb2can_driver inherit from QSerialPort, which inherit QIODevice contained SIGNAL(readyRead()). This is used in the canview for connection with handler subroutine read_u2c()

I know, in the code is a lot of garbage from testing.

In the canview.cpp void CANview::on_connectPort_released() is made connection, and in the usb2can_driver.cpp int USB2CAN_driver::connectToPort(QString portName) is part of inherit from QSerialPort.

I will be pleasure for every answer. If you think, that question is posed incorrectly, please give me feedback.

usb2can_driver.h

#ifndef USB2CAN_DRIVER_H
#define USB2CAN_DRIVER_H

#include "QSerialPort"
#include "QTimer"
#include "QObject"
#include "QSignalSpy"


class USB2CAN_driver : public QSerialPort
{
    Q_OBJECT;

public:
    USB2CAN_driver();
    //virtual ~USB2CAN_driver();

    //QSerialPort *port_USB2CAN = new QSerialPort();


    int temporary_init_Counter = 0;
    int init();
    void USB_LoopBack();
    void Boot_Mode();
    void Config_Mode();
    void Normal_Mode();
    void LoopBack_Mode();
    QByteArray Get_Mode();

    void WriteReg(QByteArray regAdress, QByteArray value[]);
    QByteArray WriteCMD(QByteArray CMD_name, QByteArray value);
    QByteArray ReadReg(QByteArray regAdress);

    QString portName;
    int connectToPort(QString portName);
    int disconnectedFromPort();

    QTimer *tim;
    int tim_counter = 0;

public: signals:
    void readyRead();


private slots:
    QByteArray read_USB2CAN();
    void initSend();
    //void timEvent();

};

#endif // USB2CAN_DRIVER_H

usb2can_driver.cpp

#include "USB2CAN_define.h"
#include "QSerialPort"
#include "QSerialPort"
#include "QObject"
#include "QDebug"
#include <QSignalSpy>



USB2CAN_driver::USB2CAN_driver()
{
    //USB2CAN_driver:: = new QSerialPort();
    //USB2CAN_driver::Baud9600;
    //USB2CAN_driver::AllDirections;
    //qDebug() << "Open port" << USB2CAN_driver::open(QIODevice::ReadWrite);
}

/*
USB2CAN_driver::~USB2CAN_driver(){
    QObject::disconnect(USB2CAN_driver::,SIGNAL(readyRead()),USB2CAN_driver::,SLOT(QByteArray read_USB2CAN()));
}
*/

int USB2CAN_driver::connectToPort(QString portName){
    //port_USB2CAN.setPortName(portName);
    USB2CAN_driver::setPortName(portName);
    USB2CAN_driver::setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);
    USB2CAN_driver::setPortName(portName);
    //Reimplemented separately as signal of driver. !!!
    //qDebug() << "connect S&S in the driver, status: " << QObject::connect(this,SIGNAL(readyRead),this,SLOT(read_USB2CAN));
    //qDebug() << "connect S&S in the driver, status: " << connect(this,SIGNAL(readyRead()),this,SLOT(read_USB2CAN()));
    //QSignalSpy spy(this, SIGNAL(readyRead()));
    //qDebug() << "from driver" << spy.wait(5000) << "----" << spy.signal();
    tim = new QTimer;

    return USB2CAN_driver::open(QIODevice::ReadWrite);
}

/*
void USB2CAN_driver::timEvent(){
    qDebug() << "Tim" << tim_counter++;
    if(tim_counter >= 5){
        tim_counter = 0;
        tim->stop();
    }
}
*/

int USB2CAN_driver::disconnectedFromPort(){
    //QObject::disconnect(this,SIGNAL(readyRead()),this,SLOT(read_USB2CAN()));
    USB2CAN_driver::close();
    if(USB2CAN_driver::isOpen()){
        return 1;
    }
    else{
        qDebug() << "------------------Port is diconected-----------------";
        return 0;
    }
}


void USB2CAN_driver::USB_LoopBack(){
}
void USB2CAN_driver::Boot_Mode(){
}
void USB2CAN_driver::Config_Mode(){
}
void USB2CAN_driver::Normal_Mode(){
}
void USB2CAN_driver::LoopBack_Mode(){
}
QByteArray USB2CAN_driver::Get_Mode(){
    while(!USB2CAN_driver::waitForBytesWritten(300)){
        USB2CAN_driver::write(getMode);
    }
    return USB2CAN_driver::readAll(); //In progress...
}

void USB2CAN_driver::WriteReg(QByteArray regAdress, QByteArray value[]){
    int length = regAdress.length() + value->length();
    QByteArray len;
    len.setNum(length);
    QByteArray sendVal[] = { writeReg, len, regAdress, *value };
    QByteArray sendData;
    sendData.fromRawData(*sendVal,sizeof (sendVal));
    while(!USB2CAN_driver::waitForBytesWritten(300)){
        USB2CAN_driver::write(sendData);
    }
}
QByteArray USB2CAN_driver::WriteCMD(QByteArray CMD_name, QByteArray value){
}
QByteArray USB2CAN_driver::ReadReg(QByteArray regAdress){
}

int USB2CAN_driver::init(){
}

QByteArray USB2CAN_driver::read_USB2CAN(){
    qDebug() <<"From driver RX" << USB2CAN_driver::readAll();
    return USB2CAN_driver::readAll();
}

void USB2CAN_driver::initSend(){
}

canview.h

#define CANVIEW_H

#include <QDialog>
#include <usb2can_driver.h>

namespace Ui {
class CANview;
}

class CANview : public QDialog
{
    Q_OBJECT

public:
    explicit CANview(QWidget *parent = nullptr);
    ~CANview();

    USB2CAN_driver *u2c;
    QTimer *time;


private: signals:
    friend void USB2CAN_driver::readyRead();
private slots:
    void on_connectPort_released();

    void on_pushButton_released();

    QByteArray read_u2c();

    void timerSubrutine();

private:
    Ui::CANview *ui;
};

#endif // CANVIEW_H

canview.cpp

#include "ui_canview.h"
#include "QSignalSpy"

CANview::CANview(QWidget *parent) : QDialog(parent),ui(new Ui::CANview)
{
    ui->setupUi(this);
    u2c = new USB2CAN_driver;

}

CANview::~CANview()
{
    delete ui;   
}

//connect fcn
void CANview::on_connectPort_released()
{
    if(u2c->isOpen()){
        u2c->disconnectedFromPort();
    }
    else{
        u2c->connectToPort(ui->inputNamePort->text());
        qDebug() << "Connect rx task, status: " << connect(???,SIGNAL(readyRead()),this,SLOT(read_u2c()));
        connect(u2c->tim,SIGNAL(timeout()),this,SLOT(timerSubrutine()));
        u2c->tim->start(800);

    }

    //Controll of opened/close port
    if(u2c->isOpen()){
        ui->connectPort->setCheckState(Qt::CheckState::Checked);
    }
    else{
        ui->connectPort->setCheckState(Qt::CheckState::Unchecked);
    }
}

//Send function
void CANview::on_pushButton_released()
{
    u2c->write(ui->TX_textBrowser->toPlainText().toLatin1(),static_cast<int>(ui->TX_textBrowser->toPlainText().length()));
    qDebug() << "Send: " << static_cast<int> (ui->TX_textBrowser->toPlainText().length());
    QSignalSpy spy(u2c,SIGNAL(readyRead()));
    qDebug() << spy.signal() << spy.signalsBlocked() << spy.isValid();
}

QByteArray CANview::read_u2c(){
    qDebug() << "RX:" << u2c->readAll();
    ui->RX_textBrowser_2->setPlainText(u2c->readAll());
    return u2c->readAll();
}

void CANview::timerSubrutine(){
    qDebug() << "TimerEvent" << u2c->tim_counter++;
    if(u2c->tim_counter >= 5){
        u2c->tim->stop();
    }
}```

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

懷念過去 2025-02-20 08:27:08

无法如 @Scheff的猫所述连接类。

解决方案是不要在 usb2can_driver 中使用QSerialport的继承。如果我想通过插槽(是第二类)连接QSerialport的信号,则必须在USB2CAN_DRIVER的构造函数中创建一个对象。

此对象允许使用信号/插槽机制。

简而
对于第二类(Canview)中的连接,我使用了此语法:

connect(u2c->port_USB2CAN,SIGNAL(readyRead()),this,SLOT(read_u2c()));

感谢Scheff的Cat,您的评论很有帮助。该解决方案正在起作用,但是如果有人看到非标准语法,请警告我。

It is impossible to connect classes as mentioned by @Scheff's Cat.

The solution is do not use inheritance from QSerialPort in the usb2can_driver. If I want connect signal of QSerialPort with slot (which is part of second class), I had to create a object from QSerialPort in the constructor of USB2CAN_driver.

This object to allow use signal/slot mechanism.

So in short: USB2CAN_driver:: was replaced by object port_USB2CAN
For the connection in the second class (canview), i used this syntax:

connect(u2c->port_USB2CAN,SIGNAL(readyRead()),this,SLOT(read_u2c()));

Thank to Scheff's Cat, your comment was helpfully. This solution is working, but if somebody see the non-standard syntax please warning me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文