代码之家  ›  专栏  ›  技术社区  ›  gr1d3r

Qt将鼠标位置写入文件

  •  0
  • gr1d3r  · 技术社区  · 5 年前

    我正在使用QT编写一个简单的应用程序,该应用程序应该将某些小部件内的鼠标位置写入文件(写入是在用户双击时)。

    情况如下:

    • 用户在小部件内执行双击。
    • 在调试窗口中,我可以看到当前的鼠标位置。
    • 鼠标位置将按预期写入文件。

    鼠标位置(X或Y)小于100时的问题。如果位置小于100,则写入文件的数字始终为3位数字。

    例如:调试窗口中的鼠标位置为:34251,文件中的位置为344251。因此,我无法预测实际的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 回复  |  直到 5 年前
        1
  •  0
  •   Stephan Schlecht    5 年前

    问题1

    缓冲区太小。

    char buf[2];
    

    需要为多个数字和一个终止的NUL字节留出位置,因为您在这里使用的是sprintf:

    ::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)) {