KM
Katty MisikТам. 31, 2020, 3: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, 3:59 Т.Ж.
  • (өңделген)

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

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

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

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

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

        QStringList points =  line.split(',');
    Evgenii Legotckoi
    • Там. 31, 2020, 4 Т.Ж.

    Добрый день.

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

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

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

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

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

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

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

      Evgenii Legotckoi
      • Там. 31, 2020, 4:07 Т.Ж.

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

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

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

        KM
        • Қыр. 1, 2020, 3:45 Т.Ж.
        • (өңделген)

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

        195,76;437,282;428,124; // первый треугольник
        195,76;437,282;428,124;// второй треугольник 
        
          KM
          • Қыр. 1, 2020, 3: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()));
          
          }
          

            Пікірлер

            Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
            Кіріңіз немесе Тіркеліңіз
            Г

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

            • Нәтиже:66ұпай,
            • Бағалау ұпайлары-1
            t

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

            • Нәтиже:33ұпай,
            • Бағалау ұпайлары-10
            t

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

            • Нәтиже:52ұпай,
            • Бағалау ұпайлары-4
            Соңғы пікірлер
            G
            GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
            Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
            d
            dblas5Шілде 5, 2024, 11:02 Т.Ж.
            QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            k
            kmssrАқп. 8, 2024, 6:43 Т.Қ.
            Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
            АК
            Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
            Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
            Енді форумда талқылаңыз
            Evgenii Legotckoi
            Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
            добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
            F
            FynjyШілде 22, 2024, 4:15 Т.Ж.
            при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
            BlinCT
            BlinCTМаусым 25, 2024, 1 Т.Ж.
            Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
            BlinCT
            BlinCTМамыр 5, 2024, 5:46 Т.Ж.
            Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
            Evgenii Legotckoi
            Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
            Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

            Бізді әлеуметтік желілерде бақылаңыз