Извините, что шлю такой большой кусок исходного кода, но времени на редактирование нету, к концу рабочего дня нужно доделать, а работа стоит из-за ошибки (в коде она отмечена комментарием). Это модифицированный пример из Qt, он называется xml/outliner М.б. здесь даже не в Qt дело. Помогите плиз, а то у меня уже мозги плавятся
Выделение миинмального кода здорово повысило бы шансы получить ответ. -- ПК.
//header file QXMLListView.h
#include <qlistview.h>
#include <qdom.h>
class PacketNodeListItem : public QListViewItem
{
public:
PacketNodeListItem ( QListView * parent , QDomNode &d );
PacketNodeListItem ( PacketNodeListItem * parent , QDomNode &d );
PacketNodeListItem ( QListView * parent, PacketNodeListItem * after , QDomNode &d );
PacketNodeListItem ( PacketNodeListItem * parent, PacketNodeListItem * after , QDomNode &d );
QDomNode *domnode() { return de; }
protected:
QDomNode *de;
};
class QXMLListView :public QListView
{
Q_OBJECT
public:
QXMLListView(const QString fileName, QWidget *parent = 0, const char *name = 0);
virtual ~QXMLListView();
private:
int packetlength;
void * datapacketptr;
QDomNode *qdm;
PacketNodeListItem *qqq;
long int offset;
QDomDocument domTree;
void getHeaderInformation( const QDomElement &header );
void buildTree( PacketNodeListItem *parentItem, const QDomElement &parentElement);
public slots:
void langChange();
void slotRMB( QListViewItem*);
};
/////Source file
#include "QXMLListView.h"
#include <qfile.h>
#include <qmessagebox.h>
#include <stdlib.h>
#include <memory.h>
#include <stdio.h>
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
PacketNodeListItem::PacketNodeListItem ( QListView * parent , QDomNode &d)
:QListViewItem (parent){
de= new QDomNode (d.cloneNode (true));
}
PacketNodeListItem::PacketNodeListItem ( PacketNodeListItem * parent , QDomNode &d)
:QListViewItem (parent){
de= new QDomNode (d.cloneNode (true));
}
PacketNodeListItem::PacketNodeListItem ( QListView * parent, PacketNodeListItem * after , QDomNode &d)
:QListViewItem (parent, after){
de= new QDomNode (d.cloneNode (true));
}
PacketNodeListItem::PacketNodeListItem ( PacketNodeListItem * parent, PacketNodeListItem * after , QDomNode &d)
:QListViewItem (parent, after){
de= new QDomNode (d.cloneNode (true));
}
QXMLListView::QXMLListView(const QString fileName, QWidget *parent, const char *name )
: QListView( parent, name )
{
addColumn( tr("Parameter") );
setSorting( -1 );
setRootIsDecorated( TRUE );
// read the XML file and create DOM tree
QFile opmlFile( fileName );
if ( !opmlFile.open( IO_ReadOnly ) ) {
QMessageBox::critical( 0,
tr( "Critical Error" ),
tr( "Cannot open file %1" ).arg( fileName ) );
return;
}
if ( !domTree.setContent( &opmlFile)) {
QMessageBox::critical( 0,
tr( "Critical Error" ),
tr( "Parsing error for file %1" ).arg( fileName ));
opmlFile.close();
return;
}
opmlFile.close();
QDomElement root = domTree.documentElement();
QDomNode node;
// create the tree view out of the DOM
node = root.firstChild();
while ( !node.isNull() ) {
if ( node.isElement() && node.nodeName() == "body") {
QDomElement body = node.toElement();
offset=0;
buildTree( 0, body);
break;
}
node = node.nextSibling();
}
connect(this, SIGNAL( pressed( QListViewItem *) ),
this, SLOT( slotRMB( QListViewItem *)) );
}
void QXMLListView::slotRMB( QListViewItem * qlv){
PacketNodeListItem *item =(PacketNodeListItem*) qlv;;
if (item->domnode()->isElement)
{
QString str= item->domnode().toElement().attribute("offset"); //здесь в рантайме вываливается ошибка защиты памяти
}
}
QXMLListView::~QXMLListView()
{
}
void QXMLListView::buildTree( PacketNodeListItem *parentItem, const QDomElement &parentElement)
{
PacketNodeListItem *thisItem = 0;
QDomNode node = parentElement.firstChild();
while ( !node.isNull() ) {
if ( node.isElement() && node.nodeName() == "element"
&&node.toElement().attribute("show")=="true") {
if ( parentItem == 0 )
thisItem = new PacketNodeListItem( this, thisItem, node );
else
thisItem = new PacketNodeListItem( parentItem, thisItem, node );
if (node.toElement().hasAttribute( "name" ))
thisItem->setText( 0, node.toElement().attribute( "name" ));
if (node.toElement().attribute("terminal")!="true") buildTree( thisItem, node.toElement() );
}
node = node.nextSibling();
}
}
Исправлена подсветка синтаксиса. -- ПК.