Qt 5: как сделать «чистый с ++» клиентский сокет?

0

Я создаю приложение QtQuick, и мне нужен TCPSocket, который опросает устройство и заполняет структуры данных, которые я хочу показать. Я нашел много образцов о сокетах и виджетах Qt 5, но я не могу создать сокет в качестве класса C++, который не был получен из QObject.

Я понимаю, что мне нужно только получить QObject, если я хочу обмениваться данными с моим представлением QML. Я написал дополнительный класс, который делает это, поэтому моему классу сокетов не нужно передавать какие-либо данные в мой QML-код.

  • 1
    Вы смотрели на QTcpSocket?
  • 0
    Да. Моей отправной точкой был пример "FortuneCookie", который использует QTcpSocket. Я сократил почти весь код до тех пор, пока не получил QObject, который после создания получает имя локального хоста и другие основные свойства с моей машины. Я пытаюсь избежать производного класса QOBject, но я не знаю, как создавать «события» между моим кодом C ++ вместо сигналов и слотов для QML. Кроме того, некоторые методы перестали компилироваться, пока класс больше не является QObject
Показать ещё 7 комментариев
Теги:
qt
sockets
qtnetwork

1 ответ

0

Вопрос почти не является вопросом Qt, а вопросом сетевого программирования C++. Я понимаю, что вы явно не любите явно использовать пользовательские классы QObject -derived, так как вы не хотите запускать moc как часть процесса сборки. В то время как можно было бы утверждать, что так плохо в этом, так как moc запускается очень много во время построения Qt собственно, отпустите с тем, что было задано на данный момент.

Если вы ищете чистую сеть C++, отличную от Qt, то Boost ASIO является очень надежным решением.

Если вы хотите использовать Qt-сеть без специального класса QObject -derived, вы можете запустить код в отдельном потоке и использовать блокировку вызовов QTCPSocket. В конце концов, это QIODevice и предлагает блокирующий интерфейс.

В конце концов, вы получаете некоторую структуру данных, которая заполняется и должна быть передана QML.

Логически ваши данные - это модель данных, а представление - в QML-коде. Вы можете использовать QStandardItemModel для этого - то есть, если вы пишете истинный код модели, как и в случае, если данные будут меняться со временем. Опять же, вы повторно используете существующий класс QObject -derived, не производя свой собственный, без написания каких-либо пользовательских сигналов или слотов.

Обходным решением для малоимущего человека является принятие QObject и размещение данных в нем с помощью динамической системы свойств через QObject::setProperty. Я не помню, чтобы, если динамические изменения свойств видны через движок QML, вам нужно будет проверить это или просто рассматривать такие объекты как константы.

Все это, кажется, много обходных путей для довольно глупой брони. Генераторы кода хороши, они экономят время. Процесс сборки сложного продукта C++ может использовать несколько различных генераторов кода, таких как генераторы лексера/парсера, генераторы конечных автоматов, генераторы вызовов удаленных процедур, генераторы таблиц, генераторы тестовых событий и т.д. По мере созревания C++ обнаружено, что способы коаксиального компилятора заменять некоторые из этих генераторов, но это просто подталкивает проблему к другому исполняемому файлу, а иногда и проталкивает его через очень маленькое отверстие для иглы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню