簡體   English   中英

編寫具有2個通道的自定義QIODevice

[英]Writing custom QIODevice with 2 channels

我正在嘗試實現自定義QIODevice。

我有一個檢測器,它將使用2個tcp套接字,一個用於發送命令和接收響應,另一個用於讀取數據。

我該怎么辦? 我試圖創建我的類,從QIODevice派生它並實現純虛擬方法,但是我遇到了一些麻煩。

我有以下代碼:

class Detector : public QIODevice {
    Q_OBJECT
    Q_DISABLE_COPY(MasterDevice)

public:
    enum CHANNEL_TYPE {
        DataChannel,
        ControlChannel
    };

private:
    QTcpSocket *controlDevice;
    QTcpSocket *dataDevice;

    QHostAddress hostAddress;

    quint16 dataPort;
    quint16 controlPort;

public:
    explicit Detector(QObject *parent, QHostAddress hostAddress, quint16 dataPort, quint16 controlPort)
        : QIODevice(parent)
        , hostAddress(hostAddress)
        , dataPort(dataPort)
        , controlPort(controlPort)
    {
        controlDevice = new QTcpSocket(this);
        connect(controlDevice, SIGNAL(readyRead()),this, SLOT(controlChannelReadReady()));

        dataDevice = new QTcpSocket(this);
        connect(dataDevice, SIGNAL(readyRead()),this, SLOT(dataChannelReadReady()));
    }

    virtual ~Detector() {}

    bool open(OpenMode mode) override {
        QIODevice::open(mode);

        controlDevice->connectToHost(hostAddress, controlPort, QTcpSocket::ReadWrite);
        dataDevice->connectToHost(hostAddress, dataPort, QTcpSocket::ReadOnly);
    }

    qint64 readData(char *data, qint64 maxSize) override {
        QTcpSocket *socket;

        switch ( currentReadChannel() ) {
        case DataChannel:
            socket = dataDevice;
            break;
        case ControlChannel:
            socket = controlDevice;
            break;
        default:
            return -1;
            break;
        }

        return socket->read(data, maxSize);
    }

    qint64 writeData(const char * data, qint64 maxSize) override {
        QTcpSocket *socket;

        switch ( currentWriteChannel() ) {
        case DataChannel:
            socket = dataDevice;
            break;
        case ControlChannel:
            socket = controlDevice;
            break;
        default:
            return -1;
            break;
        }

        return socket->write(data, maxSize);
    }

private slots:
    void controlChannelReadReady() {
        emit channelReadyRead(ControlChannel);
    }

    void dataChannelReadReady() {
        emit channelReadyRead(DataChannel);
    }
};

所以基本上我的問題是,我該如何處理這些渠道,因為例如從qt documentation我有這個

bool QIODevice::open(OpenMode mode)

打開設備並將其OpenMode設置為mode。 如果成功,則返回true;否則,返回true。 否則返回false。 任何重新實現的open()或其他打開設備的函數都應調用此函數。

因此,我必須從重寫的Open()方法中調用它,但是我查看了此方法的實現,發現該方法將通道數設置為1。如何更改此數字?

我要從QIODevice繼承的那些緩沖區是什么,該如何使用它們?

我是否缺少創建自定義QIODevice的意義? 如果是這樣,請向我解釋。

您可能不需要在這里將QIODevice子類QIODevice ,只需使用所需的語義來設計和實現接口,例如:

sendCommand();
responseReceived();
dataReady();
...
etc

QIODevice是一個通用接口,用於從/向不同的源(例如文件,套接字,串行端口等)讀取/寫入字節流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM