Qt Запись позиции мыши в файл - PullRequest
0 голосов
/ 16 февраля 2020

Я пишу простое приложение, использующее QT, которое должно записывать положение мыши внутри определенного виджета в файл (запись производится по двойному щелчку пользователя).

Ситуация следующая:

  • Пользователь выполняет двойной щелчок внутри виджета.
  • В окне отладки я вижу текущее положение мыши.
  • Положение мыши записывается в файл, как и ожидалось.

Проблема, когда положение мыши (X или Y) меньше 100. Если положение меньше 100, число, записываемое в файл, всегда равно 3 цифрам.

Например: позиция мыши в окне отладки: 34, 251, а в файле - 344, 251. Поэтому я не могу предсказать если фактическая позиция X была 34 или 344. Потому что они оба являются действительными значениями.

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

QByteArray temp1;
char buf[2];
::sprintf(buf, "%d", X);  // X is the mouse x position
temp1.append(buf);
temp1.append(",");
::sprintf(buf, "%d", Y); // Y is the mouse y position
temp1.append(buf);
...
if (tempFile.open(QIODevice::ReadWrite)) {
    QTextStream stream(&tempFile);
    stream << temp1;
}
tempFile.close();

Этот код работает хорошо только для позиций больше 100 почему-то.

Спасибо

1 Ответ

0 голосов
/ 16 февраля 2020

Проблема 1

Буфер слишком мал.

char buf[2];

Должно быть место для нескольких цифр и завершающего байта NUL, поскольку здесь используется sprintf:

::sprintf(buf, "%d", X);

Запись в конец массива приводит к неопределенное поведение .

Таким образом, вам нужно увеличить размер массива, чтобы исправить его.

Задача 2

  • файл открывается в режиме ReadWrite
  • записаны значения X и Y
  • файл закрыт

В следующий раз, когда значения записываются, вызываются те же операции. Режим ReadWrite не удаляет существующее содержимое файла. Например, если вы напишите один раз

128,1024 

, а затем в следующий раз при записи позиции: 60,30 это будет выглядеть так:

60,3024

Одним из возможных решений этой проблемы будет быть в режиме Truncate.

if (tempFile.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...