KM
Katty Misik31 серпня 2020 р. 03:53

не знаю как исправить ошибуку QList<T>::at: "index out of range", при попытке вчитать QPoint с текстового файла

Qt, QPoint

void ToolBar::on_pushButton_clicked()
{

QFile file("C:/Users/kamil/Desktop/data.txt");
QList<QPointF> pointsList;



if(file.open(QIODevice::ReadOnly | QFile::Text)){

    QTextStream  in(&file);

    while (!in.atEnd())

    {
        QString line = in.readLine();
        QStringList points =  line.split(';');

     if (points.length() > 0)

     {
         QPointF point(points.at(0).toDouble(), points.at(1).toDouble());
                         pointsList.append(point);  // и добавляем её в список
     }

        }

    file.close();

}

}

мой файл : 186,77;662,308;645,195; (Тут три точки которые я хочу нарисовать)
Буду очень благодарна за помощь!

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

5
Andrei Yankovich
  • 31 серпня 2020 р. 03:59
  • (відредаговано)

Никогда не используйте метод at. это не безопасно, в место него используйте метод value. скорее всего в вашем случае у вас нет елемента под номером 1 в вашем списке.

Метот at нужно использовать только тогда когда вам нужна ссылка или указатель на обьект внутри массива.

В коде ошибка в неправельном использовании сепаратора:

        QStringList points =  line.split(';');

если значения точки разделины ",".

        QStringList points =  line.split(',');
    Evgenii Legotckoi
    • 31 серпня 2020 р. 04:00

    Добрый день.

    Я правильно понимаю, что по факту в том файле ваши три точки выглядят так?

    186,77;
    662,308;
    645,195;

    То есть в столбик, а не в строку?

    Если так, то возможно стоит или сразу считать весь файл, то есть так QString line = in.readAll();

    Или сначала считать в вектор все строчки, а потом сформировать точки. Но сначала уточните по содержимому файла.

    Просто получается, что по факту этот кусок QStringList points = line.split(';'); не формирует правильный список точек и там внутри всего одна строчка, поскольку по факту точки написаны в столбик.

    P/S/ Используйте пожалуйста диалог вставки программного кода, это одна из кнопок в тулбаре редактора сообщений. Чтобы разметка правильно добавлялась для программного кода.

      Evgenii Legotckoi
      • 31 серпня 2020 р. 04:07

      at() возвращает константную ссылку на объект внутри массива. Согласен, что это не безопасно, если может быть выход за пределы массива, но и с использованием value я бы тоже не согласился, поскольку данный метод сконструирует переменную с параметрами по умолчанию, которая в рамках программы будет тоже не правильной. И тут возникнет другая проблема, если в случае at программа просто упадёт, то место проблемы локализуется сразу, а если будут прилетать неправильные значения, то в большом проекте можно неделю убить, чтобы найти, откуда появляется лишняя точка с неправильными данными. Тут кстати как раз этот случай.

      Поэтому я бы не был так категоричен, чтобы не использовать at вообще.

      К тому же вопрос производительности. Создание нового объекта также может быть затратным, гораздо затратнее, чем взять константную ссылку на объект.

        KM
        • 01 вересня 2020 р. 03:45
        • (відредаговано)

        у меня идет отрисовка фигур и на пример к каждому треугольнику три точки в линию следующий треугольник опять линия с тремя точкая и тд.
        Выходит как вы говорите столбик но каждая линия в нем отдельная фигура.

        195,76;437,282;428,124; // первый треугольник
        195,76;437,282;428,124;// второй треугольник 
        
          KM
          • 01 вересня 2020 р. 03:48
          • (відредаговано)

          Это два отдельных сепаратора
          класс RectToDraw, закоментировала пример точки и ее сепараторов.

          readFromString = "144,81:626,232"
          const QString &rectInString = ':'  
          char pointsSplitter = ','
          
          
          void RectToDraw::readFromString(const QString &rectInString, char pointsSplitter, char xySplitter)
          {
              QStringList point = rectInString.split(pointsSplitter);
              //point ("144,81", "626,232")
              if(point.count()!=2) return;
              QStringList xy1 = point.at(0).split(xySplitter);//xy1("144","81")
              QStringList xy2 = point.at(1).split(xySplitter);
          
              setTopLeft(QPointF(xy1.at(0).toFloat(), xy1.at(1).toFloat()));
              setBottomRight(QPointF(xy2.at(0).toFloat(), xy2.at(1).toFloat()));
          
          }
          

            Коментарі

            Only authorized users can post comments.
            Please, Log in or Sign up
            sf

            C++ - Тест 004. Указатели, Массивы и Циклы

            • Результат:90бали,
            • Рейтинг балів8
            МВ

            Qt - Тест 001. Сигналы и слоты

            • Результат:68бали,
            • Рейтинг балів-1
            ЛС

            C++ - Тест 001. Первая программа и типы данных

            • Результат:53бали,
            • Рейтинг балів-4
            Останні коментарі
            A
            ALO1ZE19 жовтня 2024 р. 08:19
            Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь Максимов05 жовтня 2024 р. 07:51
            Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas505 липня 2024 р. 11:02
            QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssr08 лютого 2024 р. 18:43
            Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий Кононенко05 лютого 2024 р. 01:50
            Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Тепер обговоріть на форумі
            J
            JacobFib17 жовтня 2024 р. 03:27
            добавить qlineseries в функции Пользователь может получить любые разъяснения по интересующим вопросам, касающимся обработки его персональных данных, обратившись к Оператору с помощью электронной почты https://topdecorpro.ru…
            ИМ
            Игорь Максимов03 жовтня 2024 р. 04:05
            Реализация навигации по разделам Спасибо Евгений!
            JW
            Jhon Wick01 жовтня 2024 р. 15:52
            Indian Food Restaurant In Columbus OH| Layla’s Kitchen Indian Restaurant If you're looking for a truly authentic https://www.laylaskitchenrestaurantohio.com/ , Layla’s Kitchen Indian Restaurant is your go-to destination. Located at 6152 Cleveland Ave, Colu…
            КГ
            Кирилл Гусарев27 вересня 2024 р. 09:09
            Не запускается программа на Qt: точка входа в процедуру не найдена в библиотеке DLL Написал программу на C++ Qt в Qt Creator, сбилдил Release с помощью MinGW 64-bit, бинарнику напихал dll-ки с помощью windeployqt.exe. При попытке запуска моей сбилженной программы выдаёт три оши…
            F
            Fynjy22 липня 2024 р. 04:15
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

            Слідкуйте за нами в соціальних мережах