What I've done:
1) Create new class MyXmlContentHandler inherited from QXmlContentHandler.
2) Implement with all its virtual function( with of one log operation in those functions)
3) Create an instance of QXmlInputSource
4) Create an instance of QXmlSimpleReader
5) set the content handler to the instance of MyXmlContentHandler
6) Parse the input source.

Result is, I can receive the startDocument() event but not others. Also the parse result is false. No event is received in error handler.

Some error note:
"This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc"

BTW, If I change the handler to an instance of default handler, that works fine.

Code:
class MyXmlContentHandler: public QXmlContentHandler
{
public:
    MyXmlContentHandler();
    bool characters(const QString & ch);
    bool endDocument();
    bool endElement(const QString & namespaceURI, const QString & localName, const QString & qName);
    bool endPrefixMapping(const QString & prefix);
    QString errorString() const;
    bool processingInstruction(const QString & target, const QString & data);
    bool startDocument();
    bool startElement(const QString & namespaceURI, const QString & localName, const QString & qName, const QXmlAttributes & atts);
    bool startPrefixMapping(const QString & prefix, const QString & uri);
    bool skippedEntity ( const QString & name );
    void setDocumentLocator ( QXmlLocator * locator );
    bool ignorableWhitespace ( const QString & ch );
};



void saxParse()
{
    QFile file("tbp.xml");

    if (!file.open(QFile::ReadOnly | QFile::Text))
    {
        qDebug()<<"Error open file";
    }
    QXmlInputSource xmlInputSource(&file);


    MyXmlSaxHandler* handler = new MyXmlSaxHandler();
    MyXmlContentHandler* contentHandler = new MyXmlContentHandler();


    QXmlSimpleReader reader;
    reader.setContentHandler(contentHandler);
    reader.setErrorHandler(handler);

    QString publicId;
    QString systemId;


    bool rlt = reader.parse(xmlInputSource);
    if(rlt)
    {
        qDebug()<<"Ok";
    }
    else
    {
        qDebug()<<"nOk";
    }
}


MyXmlContentHandler::MyXmlContentHandler()
{}

bool MyXmlContentHandler::characters(const QString & ch)
{}

bool MyXmlContentHandler::endDocument()
{
}

bool MyXmlContentHandler::endElement(const QString & namespaceURI, const QString & localName, const QString & qName)
{}

bool MyXmlContentHandler::MyXmlContentHandler::endPrefixMapping(const QString & prefix)
{}

QString MyXmlContentHandler::errorString() const
{}

bool MyXmlContentHandler::processingInstruction(const QString & target, const QString & data)
{}

bool MyXmlContentHandler::startDocument()
{
    qDebug()<<"MyXmlContentHandler::startDocument()";
}

bool MyXmlContentHandler::startElement(const QString & namespaceURI, const QString & localName, const QString & qName, const QXmlAttributes & atts)
{
   qDebug()<<"MyXmlContentHandler::startElement()";
}

bool MyXmlContentHandler::startPrefixMapping(const QString & prefix, const QString & uri)
{}

bool MyXmlContentHandler::skippedEntity ( const QString & name )
{}

void MyXmlContentHandler::setDocumentLocator ( QXmlLocator * locator )
{}

bool MyXmlContentHandler::ignorableWhitespace ( const QString & ch )
{}