65309
Qtでシリアル通信しようとしており、クラスの中でイベントを受信したいのですが  
`QObject::connect` 関数でシグナルとコールバック関数を結びつけるところでエラーになってしまいます  
参考にしたいくつかのサンプルではフォームの中で `connect` 関数を使っていると上手く行くようなのですが  
単独のクラス内で使うと上手く行かないみたいです

`connect` 関数の引数の考え方が間違っているようなのですが  
引数は  
クラスの実態  
シグナル  
送信元  
コールバック  
と思っていたのですが・・・

Qtはどうにもこうにも資料が少なくちょっと困ってます

* * *

**base.h**

```

    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>
    
    /**
     * @struct  シリアルポート設定構造体
     * @breif   シリアルポートの設定情報
     */
    struct TSettingSerial{
        QSerialPort::BaudRate   rate;       //!<    ボーレート
        QSerialPort::DataBits   databits;   //!<    データビット
        QSerialPort::Parity     parity;     //!<    パリティ
        QSerialPort::StopBits   stopbits;   //!<    ストップビット
        QString                 strComName; //!<    シリアルポートのデバイス名称
    };
    
    /**
     * @brief   シリアルポートを操作するクラス
     * @details 送受信はこのクラスで全部やる
     */
    class CSerialBase
    {
    public:
        //メソッド
        CSerialBase();  //!<    コンストラクタ
        ~CSerialBase(); //!<    デストラクタ
    private :
        QSerialPort port;       //!<    シリアルポートオブジェクト
        void readdataWait();
    public:
        bool open (TSettingSerial *setting);    //!<    ポートオープン
        void close();                           //!<    ポートクローズ
        bool write(const char*,qint64);         //!<ライト関数
    };
    
```

**base.cpp**

```

    #include "cserialbase.h"
    
    #include    <QDebug>
    #include    <qthread.h>
    
    /**
     * @brief コンストラクタ
     */
    CSerialBase::CSerialBase()
    {
        //port = new  QSerialPort(this);
    }
    
    /**
     * @brief デストラクタ
     */
    CSerialBase::~CSerialBase()
    {
        //デストラクタが呼ばれることがあるかわからないが、取りあえずクローズ
        port.close();
    }
    
    void CSerialBase::readdataWait()
    {
        int readedsize = 0;
        const int bufsize = 256;
        QByteArray buf;
        QString qs;
    
        while(true){        
            buf = port.readAll();
            if(buf.count() != 0){
               qDebug() << QString(qs.count());
            }
            QThread::msleep(10);
        }
    }
    
    /**
     * @brief           ポートオープン
     * @details         設定に従い、シリアルポートをオープンする
     * @param setting   シリアルポートの設定
     * @return          true=成功/失敗
     */
    bool CSerialBase::open(TSettingSerial *setting)
    {
        bool boRet = false;
    
        port.setPortName(setting->strComName);      //デバイス名称
        port.setBaudRate(setting->rate);            //ボーレート
        port.setDataBits(setting->databits);        //データビット
        port.setParity(setting->parity);            //パリティ
        port.setStopBits(setting->stopbits);        //ストップビット
        //オープン実行
        boRet = port.open(QIODevice::ReadWrite);
        if(boRet == false){
            qDebug() << "ポートオープン失敗\n";
        }else{
            qDebug() << "ポートオープン成功\n";
            QObject::connect(&port,&QSerialPort::readyRead,this,&CSerialBase::readdataWait);    //★★★★ここがコンパイルエラー thisがまずそう
            // readしたときに関数を呼ぶ
            //readdataWait();
        }
    
        return boRet;
    }
    
    /**
     * @brief シリアルポートクローズ
     */
    void CSerialBase::close()
    {
        port.close();
    }
    
    /**
     * @brief   シリアルポート送信
     * @return  true=成功 / false=失敗
     */
    bool CSerialBase::write(const char * data, qint64 len)
    {
        qint64 iret = port.write(data, len);
        if(iret >= 0){
            return true;
        }else{
            qDebug() << "送信失敗:" << port.errorString();
            return false;
        }
    }
    
```
CC BY-SA 4.0
2020-04-02T11:25:49.920
65308
2020-04-03T00:37:53.087
2020-04-03T00:37:53.087
3060
15047
question
c++ linux qt
Qtでシリアル通信 (connect関数がコンパイルエラー)
`CSerialBase::readdataWait`をslotとして定義するのであれば、

  1. `CSerialBase`クラスを`QObject`の派生クラスとして定義する。
  2. クラス宣言の最初に`Q_OBJECT`マクロを記載する。
  3. `readdataWait`メソッドを`slots`セクションで宣言する。

必要があると思います。

参考: Qt Documentation - Signals & Slots  
<https://doc.qt.io/qt-5/signalsandslots.html>

具体的には、次のように`CSerialBase`クラスを宣言すればよいと思います。

```

    class CSerialBase : public QObject
    {
        Q_OBJECT
    public:
        //メソッド
        CSerialBase();  //!<    コンストラクタ
        ~CSerialBase(); //!<    デストラクタ
    private :
        QSerialPort port;       //!<    シリアルポートオブジェクト
    
    public slots:
        void readdataWait();
    
    public:
        bool open (TSettingSerial *setting);    //!<    ポートオープン
        void close();                           //!<    ポートクローズ
        bool write(const char*,qint64);         //!<ライト関数
    };
    
```
CC BY-SA 4.0
2020-04-02T12:07:59.523
65309
2020-04-02T12:07:59.523
20098
65308
answer