0

QTcpsocket/QTcpserver transmission, how to use QdataStream to transfer a table data??

There are ideas: Write data stream on each row and then call write(), but how to write again?

Existing issues: Data is garbled, the first line of data is written repeatedly..

Extract saved data stream data from fh file, write self.block for TCP transfer (The data is saved in the format of each row of the table, the number of rows and list data is read out) ->Cannot be displayed properly Seeking examples or ideas, written in PYQT5

Server code:

self.block = QByteArray()
fh = QFile(name)
        fh.open(QIODevice.ReadOnly)
        tableData = QDataStream(fh)        # Get Data from File
        tableData.setVersion(QDataStream.Qt_5_6)

        stream = QDataStream(self.block, QIODevice.WriteOnly)    # Input data to socket
        stream.setVersion(QDataStream.Qt_5_6)    
        self.clientConnection = self.server.nextPendingConnection()    


        while not tableData.atEnd():
            num,table=0,''
            num = tableData.readUInt16()
            table = tableData.readQStringList()

            stream.writeUInt16(0)
            stream.writeUInt16(num)
            stream.writeQStringList(table)
            stream.device().seek(0)
            stream.writeUInt16(self.block.size() - SIZEOF_INT16)  #
            self.clientConnection.write(self.block)
            self.clientConnection.flush()

client.py

def readMessage(self):
    try:

        print('readmessage')

        stream = QDataStream(self.socket)
        stream.setVersion(QDataStream.Qt_5_6)
        while not stream.atEnd():

            if self.blockSize == 0:

                if self.socket.bytesAvailable()<SIZEOF_UINT16:

                    return
                self.blockSize = stream.readUInt16()

            if self.socket.bytesAvailable()<self.blockSize:

                return
            num=stream.readUInt16()
            message = stream.readQStringList()      #?????????

            print(num,message)
            if num<1:

                self.tableWidget.setRowCount(1) # First row Data
                for a in range(0, 11):
                    # print(a)
                    newItem = QTableWidgetItem(message[a])
                    self.tableWidget.setItem(0, a, newItem)
            else:
                self.tableWidget.insertRow(0)
                for a in range(0, 11):                      
                    newItem = QTableWidgetItem(message[a])
                    self.tableWidget.setItem(0, a, newItem)
        print('closee')
        self.socket.disconnect()
        self.socket.close()

    except:
        self.socket.close()

The input Data:

enter image description here

The error output data:

enter image description here

eyllanesc
  • 235,170
  • 19
  • 170
  • 241

0 Answers0