【问题标题】:Why I can't reimplement methode from QIODevice when base class is QFile?当基类是 QFile 时,为什么我不能从 QIODevice 重新实现方法?
【发布时间】:2018-09-18 05:35:39
【问题描述】:

当我的基类是 QIODevice 时,我可以重新实现 writeData 和 readData,但如果基类是 QFile,它就不起作用。 OFile的基类是QFileDevice,QFileDevice的基类是QIODevice:

//This works:
//class xyseriesiodevice : public QIODevice

//This doesn't work
class xyseriesiodevice : public QFile
{
    Q_OBJECT
public:
    explicit xyseriesiodevice(QXYSeries * series, QObject *parent = 0);

protected:
    qint64 readData(char * data, qint64 maxSize);
    qint64 writeData(const char * data, qint64 maxSize);

打电话时

//m_device is of type xyseriesiodevice
//m_audioInput is of type QAudioInput    
m_device->open(QIODevice::WriteOnly);
m_audioInput->start(m_device);

writeData from xyseriesiodevice 仅在基类为QIODevice 时调用

谢谢!!

【问题讨论】:

  • 它应该可以工作。你检查过open() 调用的结果吗?如果打开失败,那么 QAudioOutput 可能不会调用 writeData()
  • FWIW 我尝试修改 QT 示例程序(qtmultimedia/examples/multimedia/audioinput),使其 AudioInfo 类子类 QFile 而不是 QIODevice,并且在这样做之后(并在更改 AudioInfo::start()调用 open(stdout, QIODevice::WriteOnly)) 的方法,我可以看到 AudioInfo::writeData() 正在以 4096 字节的音频数据块定期调用。这是在带有 Qt 5.10.0 的 MacOS/X 下。

标签: c++ qt inheritance qfile qiodevice


【解决方案1】:

如果您没有包含 QFile 库,请尝试包含它。 尝试在方法签名后添加“覆盖”关键字。

qint64 readData(char * data, qint64 maxSize) override;
qint64 writeData(const char * data, qint64 maxSize) override;

【讨论】:

  • 如果未声明QFile,代码将无法编译 - 这是一些货物崇拜的建议。 override 是正确的建议。
猜你喜欢
  • 2022-10-04
  • 1970-01-01
  • 2015-09-21
  • 2016-06-14
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多