Qt将鼠标位置写入文件

时间:2020-02-16 08:01:15

标签: c++ qt file-io

我正在使用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 :(得分:0)

问题1

缓冲区太小。

char buf[2];

由于您在此处使用sprintf,因此需要放置多个数字和一个终止NUL字节:

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

在数组末尾写操作将得到undefined behavior

因此,您需要增加数组的大小才能对其进行修复。

问题2

  • 以ReadWrite模式打开文件
  • 写入X和Y值
  • 文件已关闭

下次写入值时,将调用相同的操作。 ReadWrite模式不会删除文件的现有内容。例如,如果您只写一次

128,1024 

,然后下一次您写位置:60,30看起来像这样:

60,3024

解决此问题的一种可能方法是应用Truncate模式。

if (tempFile.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
相关问题