【问题标题】:Qchar* to char* conversionQchar* 到 char* 的转换
【发布时间】:2012-11-21 18:25:40
【问题描述】:

我正在构建一个 Qt Gui 应用程序来监视来自串行端口的数据。我正在使用qextserialport 库。这是我遇到的问题。

void MainWindow::onDataAvailable()
{
    QString data_ser,data_trimmed;
    port->readLine(data_ser.data(),0);
    data_trimmed = data_ser.trimmed();
    ui->textEdit->append(data_trimmed);
}

readLine 方法的第一个参数应该是char* 类型。如何将data_ser.data() 返回的QChar* 转换为char*。我可以使用std::string 而不是QString,但是qt gui 对象是更好地兼容 QString,我也需要 trimmed 方法。

这是我得到的错误:

没有匹配的成员函数调用“readLine”。 第一个参数没有从 'QChar *' 到 'char *' 的已知转换。

如何解决这个问题??

【问题讨论】:

    标签: c++ qt serial-port qchar


    【解决方案1】:

    您不能,或者至少您不想这样做(当然,在 C++ 中,您可以将 QChar* 转换为 char*,但这不会使其工作)。只需将数据读入 QByteArray,然后将其转换为 QString。

    【讨论】:

    • 在这种情况下,QByteArray 是否比普通的 char[] 有任何真正的优势 - 它不只是混淆了代码吗? (ps不是火焰 - 真正的问题)
    • QByteArray 将真实数据放入堆中,并且数据是隐式共享的,因此您可以从方法中返回 QByteArray 而无需担心谁将删除/释放数据。 QByteArray 可以轻松调整大小。许多 Qt 方法采用 QByteArray,在这种情况下,您不需要额外的缓冲区大小参数,通常您不需要单独跟踪大小,QByteArray 会为您完成。因此,一旦您开始在 char[] 之上实现任何这些,通常最好切换到 QByteArray。但是,当您只需要堆栈中的简单本地缓冲区时,请使用 char[]。
    【解决方案2】:

    这有点棘手,因为您需要为 readline() 分配空间来复制。

    您可以使用an initial size 创建一个 QString,但我个人会分配一个具有固定合理缓冲区大小的 char*,然后从中创建 QString - 它在您调试时会更加清晰。

    【讨论】:

    • char data_ser[1024];端口->readLine(data_ser,sizeof(data_ser)); QString data_new(data_ser);像这样?
    • 是的,readline 可能有一个参数来限制正在读取的数据的大小,但 1K 应该是安全的(著名的遗言!)
    • Andddd 它的工作就像一个魅力;)......谢谢你,我能够制作我自己的串行数据监视器:)
    • ...并且您想在从 char*/QByteArray 转换为 QString 时显式指定编码,例如使用fromUtf8、fromLatin1等,而不是隐式转换。
    • @FrankOsterfeld - 好点 - 虽然如果您是从串行端口上的数据记录器中读取数据,那肯定是很简单的 ascii
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多