Я хочу использовать некоторые стандартные методы QUdpSocket
, если быть точным read()
и readAll()
. Так, в соответствии с документацией QUdpSocket
:Использование QUdpSocket как QIODevice
Если вы хотите использовать стандартные функции
QIODevice
read()
,readLine()
,write()
и т.д., вы должны сначала соединить разъем непосредственно к партнеру по телефонуconnectToHost()
.
Я называю connectToHost()
непосредственно после bind()
:
socket.bind(QHostAddress::LocalHost, 14560);
socket.connectToHost(QHostAddress::LocalHost, 14560);
Теперь он может читать, но он не излучает readyRead()
сигнал. Каков правильный способ использования QIODevice
функции QUdpSocket
?
DeviceReader.h:
class DeviceReader : public QObject {
Q_OBJECT
public:
DeviceReader() {}
void setDevice(QIODevice * device) {
_device = device;
connect(device, &QIODevice::readyRead, this, &DeviceReader::onDataReceived);
}
void onDataReceived() {
qDebug() << "received: " << _device->readAll();
}
private:
QIODevice * _device;
};
main.cpp:
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
DeviceReader reader;
QUdpSocket socket;
socket.bind(QHostAddress::LocalHost, 14560);
socket.connectToHost(QHostAddress::LocalHost, 14560);
reader.setDevice(&socket);
return a.exec();
}
Qt версии 5.7.0 лязг x64. ОС: macOS Sierra 10.12.2.
Да, это работает, но в этом случае я должен использовать 'readDatagram()' и 'writeDatagram()' вместо методов read() 'и' write() '. И я хочу использовать тот же метод 'onDataReceived()' для получения от любых 'QIODevie' (' QTcpSocket', 'QSerialPort' и т. Д.). –
Итак, можно ли одновременно использовать методы 'read()', 'write()' и 'readyRead()'? –
Камиль, похоже что QIODevice интерфейс можно использовать только для udp-клиента :-(Какой-то эпический сбой у qt'шников. – Andrey