【问题标题】:Qt C++ - QDataStream not reading boolean valuesQt C++ - QDataStream 不读取布尔值
【发布时间】:2014-10-19 19:17:17
【问题描述】:

你好世界,我正在做一个项目,我可以序列化文件中的对象并稍后读取它,但是当我写入值(布尔值)时,它可以工作,但是当我尝试读取它们时,这就是我得到:

binary '>>' : 没有找到接受右手操作数的运算符 输入 bool(或没有可接受的转换)

这是我的代码

      void MainWindow::writeSettings()
      {
         QFile *settingsFile = new QFile(":/images/settings_file.txt");

         if(!settingsFile->open(QIODevice::WriteOnly))
         {
          qDebug() << "File not responsing";

         } else
         {
           QDataStream out(settingsFile);
          out.setVersion(QDataStream::Qt_5_3);
          out << settings->getEnableWordWrap();
          out << settings->getShowStatusbar();
          out << settings->getShowToolbar();
}

settingsFile->flush();
settingsFile->close();

}

现在如果我尝试阅读,得到错误

         QFile selc(":/images/settings_file.txt");

if(!selc.open(QIODevice::ReadOnly))
{
    qDebug() << "File not responding";
} else
{
    QDataStream in(&selc);
    in >> settings->getEnableWordWrap() >> settings->getShowStatusbar() >> settings->getShowToolbar();
}

selc.close();

getEnableWordWrap()getShowStatusbar()getShowToolbar() 都是布尔返回类型。

【问题讨论】:

    标签: c++ qt stream


    【解决方案1】:

    您正在尝试更改您的 getter 提供的

    在将它们传递给正确的设置器之前,您应该更喜欢从流中提取布尔值:

    QDataStream in(&selc);
    bool tmp;
    in >> tmp;
    settings->setEnableWordWrap(tmp);
    in >> tmp;
    settings->setShowStatusbar(tmp);
    in >> tmp;
    settings->setShowToolbar(tmp);
    

    使用 Qt 实现这一目标的更面向对象的方法是定义这两种方法来处理 QDataStream 序列化:

    QDataStream &operator<<(QDataStream &, const MySettings &);
    QDataStream &operator>>(QDataStream &, MySettings &);
    

    因此,您可以像这样反序列化您的设置:

    QDataStream in(&selc);
    in >> settings;
    

    【讨论】:

    • 也可以提取到通用访问器函数。给定一个bool &amp; Settings::enableWordWrap(),你可以简单地做in &gt;&gt; settings-&gt;enableWordWrap()。有时人为拆分的 getter-setter 有点麻烦。
    • @KubaOber:同意 getter/setter 的人工感觉。但是在使用 Qt 时,尤其是使用 QML 集成和 QObject 属性时,getter/setter 允许在正确的位置使用通知信号。
    • getter/setter 和通知器信号是不同的概念。您可以拥有一个返回引用的 getter,可用作 setter,以及一个接受新值作为参数的显式 setter。无论您是否使用通知信号,两者都可以共存。
    • 当然,也许我太自动了,无法采用 getter/setter 方式。这是我研究的示例和项目中经常使用的东西。在某些情况下,您的方式有优势。