【问题标题】:Implement QIODevice driven class实施QioDevice驱动的课程
【发布时间】:2018-11-27 12:04:04
【问题描述】:

我正在尝试实现一个继承自 QIODevice 的类。

QT 文档说: Subclasses of QIODevice are only required to implement the protected readData() and writeData() functions

我试图创建一个基本的虚拟类,除了打印函数之外没有做太多的事情,这里是代码:

class dummyClass : public QIODevice
{
    Q_OBJECT
    Q_DISABLE_COPY(dummyClass)

public:
    explicit dummyClass( QObject *parent = 0): QIODevice(parent)
    {
        qDebug() << __FUNCTION__ <<endl;
    }

protected:
    qint64 readData(char *data, qint64 len)
    {
        qDebug() << __FUNCTION__ <<endl;
        return 0;
    }

    qint64 writeData(const char *data, qint64 maxSize)
    {
        qDebug() << __FUNCTION__ <<endl;
        return 0;
    }

};

这是检查类的代码:

dummyClass try_file;
try_file.write("hello to all the good people");
try_file.close();

当我运行代码时,我得到以下输出:

dummyClass ::dummyClass 
QIODevice::write (a): device not open

换句话说,发生的事情是该类转向原始的 WRITE 函数,而不是像文档中所说的那样将调用重定向到 writeData,而是执行了阻碍写入的操作。

谁能告诉我我的错误在哪里? (假设我不想自己实现 QIODevice 类中的所有 READ 和 WRITE 函数)

【问题讨论】:

  • 你不能实现所有的读写函数,因为它们不是虚拟的。它们是QIODevice 行为的一部分。它们是使对象成为QIODevice 的合同的一部分。事实上,就阅读而言,除了分行助手之外,除了readData,您别无他法。

标签: c++ qt c++11


【解决方案1】:

万一其他人遇到这种情况,QIODevice 在将会话转移到可读和可写的 WRITE 函数之前检查访问权限。 因此,在打开文件的过程中,您必须将对象设置为所需的状态,否则它将使您陷入读写状态。

【讨论】:

  • 您的问题根本没有显示“打开文件的过程”。你没有实现任何类似于open 的东西。为什么您希望关闭的文件能够工作? :) 错误将您直接指向解决方案 :)
猜你喜欢
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多