Russian Qt Forum
Ноябрь 24, 2024, 22:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / QTextEdit. Перемещение по строкам(параграфам) : Ноябрь 16, 2021, 09:32
Доброго дня!
Не могу понять, как можно перемещаться по строкам(параграфам) в QTextEdit.
Я добавляю строки командой QTextEdit::append. Но есть ли команда, с помощью которой можно переместиться, например, на вторую строку(параграф) и далее заместить ее?
спасибо
2  Qt / Работа с сетью / Re: QTcpSocket. Хост найден, но далее возникает ошибка NetworkError : Ноябрь 01, 2021, 07:27
Короче, ответ был неожиданно найден,и он вверг в меня удивление и ступор со словами "какого органа...".
Есть функция
Код:
socket->connectToHost(ipStr, ipport);
.

Если стринговая ipStr представлена в виде айпи адреса "192.168.127.012", то не происходит соединение, а если представить в виде "192.168.127.12", то все нормально, все работает, есть коннект. Далее узнал еще более интересные вещи, когда попытался применить класс QHostAddress, создавая его экземпляр QHostAddress("192.168.127.012"), и видя, как айпи адрес вдруг превращается в "192.168.127.10". Вот вопрос ко всем, почему цифры с начальным нулем функции,работающие с сетью,воспринимают как будто это записано в восьмеричной системе исчисления??? Что интересно,если я записываю адрес "192.168.127.090", то вообще полный крах происходит.
3  Qt / Работа с сетью / Re: QTcpSocket. Хост найден, но далее возникает ошибка NetworkError : Октябрь 30, 2021, 11:59
Пингуется - не означает, что остальные порты открыты. Я бы посмотрел сначала. Хотя бы с помощью nmap.
другой программой,написанной не на Qt, нормально происходит соединение с прибором
4  Qt / Работа с сетью / QTcpSocket. Хост найден, но далее возникает ошибка NetworkError. Решено. : Октябрь 30, 2021, 09:11
Доброго дня!
Пытаюсь подсоединиться к прибору, на котором стоит адаптер MOXA, работающий в режиме TCP Server. Естественно, на компе есть подсеть, в которую входит этот прибор.
Задействовал сигналы
Код:
    
    connect(socket, &QTcpSocket::readyRead, this, &ProtectWindow::socketReadySlot);
    connect(socket, &QTcpSocket::disconnected, this, &ProtectWindow::socketDisconnectSlot);
    connect(socket, &QTcpSocket::hostFound, this, &ProtectWindow::hostFoundSlot);
    connect(socket, &QTcpSocket::connected, this, &ProtectWindow::connectedSlot);
    connect(socket, &QTcpSocket::stateChanged, this, &ProtectWindow::stateChangedSlot);

Пытаюсь соединиться с хостом
Код:
socket->connectToHost(ipaddress, ipport);

В дебаге вывожу и получаю такие сообщения:
Цитировать
QAbstractSocket::HostLookupState
QAbstractSocket::ConnectingState
host found
QAbstractSocket::UnconnectedState
socket error:  "Error: An error occurred with the network (e.g., the network cable was accidentally plugged out)."

Я новичок в работе с  TCP. Не понимаю,почему компонент QTcpSocket не может соединиться с хостом?
С компа прибор с тем айпи адресом пингуется норм.
5  Qt / 2D и 3D графика / Re: Qwt. QwtPlotZoomer. сигнал zoomed : Октябрь 29, 2021, 10:38
По идее можно выводить значения курсора прямо на холст, чтобы посмотреть координаты
Нужно создать QwtPlotPicker с заданным trackerMode = QwtPicker::AlwaysOn
это я делаю. Но я хотел с помощью зумирования раскрыть сигнал на размер прямоугольника зума, но не могу узнать размер резинки зума
6  Qt / 2D и 3D графика / Qwt. QwtPlotZoomer. сигнал zoomed : Октябрь 29, 2021, 10:18
Доброго дня!
Проблема вышла с зумированием графика. Когда растягиваю резинку и отпускаю ее, то испускается сигнал zoomed(const QRectF &rect).
Сигнал рисуется в районе 0.0004 +- шум. Так вот, как только я пытаюсь зумировать этот сигнал, то значения rect->bottom  и rect->top упираются в значения -0.004(top) и 0.005(bottom) по оси Y, хотя резинку зума я провожу на границах сигнала. Это что, ограничение класса такое? Как я могу узнать действительные значения top и bottom резинки?
7  Qt / Вопросы новичков / Re: Проблема с получением данных с помощью QSerialPort::waitForReadyRead() : Сентябрь 25, 2021, 14:22
Вы сначала определитесь - хотите понять, как организовать синхронный обмен с портом или нет. Если появится желание, то поможем.
Очень хочу,но мне непонятно, как организовать синхронный обмен с помощью сигналов и слотов.
Как идет работа с шиной у нас:
операция чтения данных происходит в последовательности:
1. запрос данных
2. чтение данных
3. запрос статуса
4. чтение статуса для подтверждения чтения данных

операция записи команд/данных происходит в последовательности:
1. запись команды
2.чтение статуса для подтверждения записи команд/данных

внутри этих блоков все должно идти последовательно.
Читаться данные должны как можно быстрее и постоянно.
Сделал отдельный неграфический поток, в котором в функции run() идет постоянный опрос шины через QSerialPort, чтоб не зависал графич.интерфейс

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







8  Qt / Вопросы новичков / Re: Проблема с получением данных с помощью QSerialPort::waitForReadyRead() : Сентябрь 25, 2021, 12:27
бред в коде написан, везде

переделай на события !

т.е. бред написан,значит, в примерах Qt? это во-первых.
Во-вторых, сама функция waitForReadyRead() разработчиками QSerialPort должна работать как заявлено и тогда код тоже будет работать окей

9  Qt / Вопросы новичков / Проблема с получением данных с помощью QSerialPort::waitForReadyRead() : Сентябрь 25, 2021, 08:28
Доброго всем дня

Версия Qt 5.14.2

Суть проблемы.
Реализуется синхронный обмен данными с устройством. Необходим постоянный опрос данных по шине. Устройству посылаются команды, на которые получаются подтверждения выполнения, далее тут же идет опрос данных с их подтверждениями.
Реализовать это с помощью механизма сигнал-слот чрезвычайно запутанно и геморрно.
Наиболее подходящий метод - это реализация работы с последовательным портом с помощью waitForReadyRead() и waitForBytesWritten() в отдельном неграфическом потоке, в котором идет постоянный опрос шины(запись команд в порт и считывание данных с порта).
Тем более, что есть в Qt пример работы Blocking Master и Blocking Slave.

Так вот столкнулся с проблемой,что, послав запрос на пакет данных, waitForReadyRead() сообщает,что есть данные, но с помощью readAll() считывается только часть пришедшего пакета, а потом хоть сиди в этом waitForReadyRead() - он уже не сообщает о наличии данных. Хотя полностью весь пакет пришел - это видно с помощью шпиона компорта,который пришлось подключить для прослушки. Когда же я повторно запрашиваю данные, то пара waitForReadyRead()  - readAll() выдает мне вместе вторую часть непришедшего вовремя пакета и часть следующего пакета.
Но это для моей задачи уже бесполезно,т.к. я не могу дать подтверждение на пакетное получение данных.

кусок проги такой
Код:
  // запись данных
  serial.write(dataRequest);
  // ожидание записи в порт
  if (serial.waitForBytesWritten(100) == false) return false;

  // ожидание прихода полного кадра
  flag = true;
  *receivear = new QByteArray();
  receive = *receivear;

  do{
    // ждем ответные данные
    if (serial.waitForReadyRead(100) == false){
      qDebug() << "fail";
      return false;
    };

    // считывание данных
    readData = serial.readAll(); while (serial.waitForReadyRead(10)) readData += serial.readAll();
    qDebug() << "Data read: " << readData.toHex(' ');

    // анализ кадра
    if (cadrAnalysis(readData, *receive) == true) flag = false;
  } while (flag);
Этот кусок кода из функции,которая вызывается из void ProtocolThread::run(),соответственно, ProtocolThread это потомок QThread.

Я вполне понимаю,что сейчас прибегут гуру и скажут, что надо работать с помощью механизма "сигнал-слот", но, извините, Qt задекларировала функцию waitForReadyRead(), и она должна работать нормально, а не через пень колоду. Да и механизм "сигнал-слот" в моем случае не подходит.

Вопрос такой у меня: что можно сделать с этим waitForReadyRead(), чтобы все заработало? Если делаю вызов waitForReadyRead(-1), то просто поток блокируется на этом вызове, хотя данные из устройства в компорт пришли.

Согласно справке, waitForReadyRead() блокируется до тех пор, пока новые данные не будут доступны для чтения  и не будет выдан сигнал readyRead(). Получается,что на вторую часть пакета этот сигнал не выдается и waitForReadyRead() не разблокируется.
Попробовал сделать опрос с помощью механизма "сигнал-слот", подготовив предварительно устройство к опросу с помощью другой программы, то в этом случае видно,что часто пакет считывается полностью после обработки двух последовательно пришедших сигналов readyRead()

ПС. Эта проблема заметилась,когда начал читать пакеты с длиной более 250 байт. Когда надо было читать пакеты с длиной 64 байта, было все нормально
10  Qt / Работа с сетью / QTcpSocket. Повторное открытие : Август 27, 2021, 09:31
ВОПРОС СНЯТ. При обработке сигнала disconnected вызывал функцию socket->deleteLater(). Изза этого и проблема была


Доброго времени суток!
Сильно не пинайте, только начал изучать сетевые дела в Qt.
Создаю TCP-клиента для подключения к прибору. Проблема возникла с переподключением, после которого программа аварийно срубается.

Открываю соединение как обычно
Код:
socket->connectToHost(ipaddress, ipport);

Закрываю соединение
Код:
socket->close();

Получаю сигнал disconnected.

Далее снова пытаюсь сделать
Код:
socket->connectToHost(ipaddress, ipport);

на чем программа благополучно вылетает.

Пробовал закрыть с помощью
Код:
socket->abort();
Эффект тот же

Что не так делается?
Страниц: [1]

Страница сгенерирована за 0.054 секунд. Запросов: 24.