resource.cpp

来自「qt-x11-free-3.0.3.tar.gz minigui图形界面工具」· C++ 代码 · 共 1,943 行 · 第 1/5 页

CPP
1,943
字号
	    item->setPixmap( i, pixmaps[ i ] );	}	lastItem = item;    }}QWidget *Resource::createSpacer( const QDomElement &e, QWidget *parent, QLayout *layout, Qt::Orientation o ){    QDomElement n = e.firstChild().toElement();    int row = e.attribute( "row" ).toInt();    int col = e.attribute( "column" ).toInt();    int rowspan = e.attribute( "rowspan" ).toInt();    int colspan = e.attribute( "colspan" ).toInt();    if ( rowspan < 1 )	rowspan = 1;    if ( colspan < 1 )	colspan = 1;    Spacer *spacer = (Spacer*) WidgetFactory::create( WidgetDatabase::idFromClassName("Spacer"),						      parent, "spacer", FALSE);    spacer->setOrientation( o );    spacer->setAutoResize( FALSE );    while ( !n.isNull() ) {	if ( n.tagName() == "property" )	    setObjectProperty( spacer, n.attribute( "name" ), n.firstChild().toElement() );	n = n.nextSibling().toElement();    }    spacer->setAutoResize( TRUE );    if ( formwindow )	formwindow->insertWidget( spacer, pasting );    if ( layout ) {	if ( layout->inherits( "QBoxLayout" ) )	    ( (QBoxLayout*)layout )->addWidget( spacer, 0, spacer->alignment() );	else	    ( (QDesignerGridLayout*)layout )->addMultiCellWidget( spacer, row, row + rowspan - 1, col, col + colspan - 1,								  spacer->alignment() );    }    return spacer;}/*!  Attention: this function has to be in sync with Uic::setObjectProperty(). If you change one, change both.*/void Resource::setObjectProperty( QObject* obj, const QString &prop, const QDomElement &e ){    const QMetaProperty *p = obj->metaObject()->property( obj->metaObject()->findProperty( prop, TRUE ), TRUE );    if ( !obj->inherits( "QLayout" )  ) {// no layouts in metadatabase... (RS)	if ( obj->inherits( "CustomWidget" ) ) {	    MetaDataBase::CustomWidget *cw = ( (CustomWidget*)obj )->customWidget();	    if ( cw && !cw->hasProperty( prop.latin1() ) && !p && prop != "toolTip" && prop != "whatsThis" )		return;	}	MetaDataBase::setPropertyChanged( obj, prop, TRUE );    }    QVariant defVarient;    if ( e.tagName() == "font" ) {	QFont f( qApp->font() );	if ( obj->isWidgetType() && ( (QWidget*)obj )->parentWidget() )	    f = ( (QWidget*)obj )->parentWidget()->font();	defVarient = QVariant( f );    }    QString comment;    QVariant v( DomTool::elementToVariant( e, defVarient, comment ) );    if ( !comment.isEmpty() ) {	MetaDataBase::addEntry( obj );	MetaDataBase::setPropertyComment( obj, prop, comment );    }    if ( e.tagName() == "pixmap" ) {	QPixmap pix = loadPixmap( e );	if ( pix.isNull() )	    return;	v = QVariant( pix );    } else if ( e.tagName() == "iconset" ) {	QPixmap pix = loadPixmap( e, "iconset" );	if ( pix.isNull() )	    return;	v = QVariant( QIconSet( pix ) );    } else if ( e.tagName() == "image" ) {	v = QVariant( loadFromCollection( v.toString() ) );    }    if ( !p ) {	MetaDataBase::setFakeProperty( obj, prop, v );	if ( obj->isWidgetType() ) {	    if ( prop == "database" && obj != toplevel ) {		QStringList lst = MetaDataBase::fakeProperty( obj, "database" ).toStringList();		if ( lst.count() > 2 )		    dbControls.insert( obj->name(), lst[ 2 ] );		else if ( lst.count() == 2 )		    dbTables.insert( obj->name(), lst );	    }	    return;	}    }    if ( e.tagName() == "palette" ) {	QDomElement n = e.firstChild().toElement();	QPalette p;	while ( !n.isNull() ) {	    QColorGroup cg;	    if ( n.tagName() == "active" ) {		cg = loadColorGroup( n );		p.setActive( cg );	    } else if ( n.tagName() == "inactive" ) {		cg = loadColorGroup( n );		p.setInactive( cg );	    } else if ( n.tagName() == "disabled" ) {		cg = loadColorGroup( n );		p.setDisabled( cg );	    }	    n = n.nextSibling().toElement();	}	v = QPalette( p );    } else if ( e.tagName() == "enum" && p && p->isEnumType() ) {	QString key( v.toString() );	v = QVariant( p->keyToValue( key ) );    } else if ( e.tagName() == "set" && p && p->isSetType() ) {	QString keys( v.toString() );	QStringList lst = QStringList::split( '|', keys );	QStrList l;	for ( QStringList::Iterator it = lst.begin(); it != lst.end(); ++it )	    l.append( *it );	v = QVariant( p->keysToValue( l ) );    }    if ( prop == "caption" ) {	QCString s1 = v.toCString();	QString s2 = v.toString();	if ( !s1.isEmpty() )	    formwindow->setCaption( s1 );	else if ( !s2.isEmpty() )	    formwindow->setCaption( s2 );    }    if ( prop == "icon" ) {	formwindow->setIcon( v.toPixmap() );    }    if ( prop == "geometry" ) {	if ( obj == toplevel ) {	    hadGeometry = TRUE;	    toplevel->resize( v.toRect().size() );	    return;	} else if ( obj == formwindow->mainContainer() ) {	    hadGeometry = TRUE;	    formwindow->resize( v.toRect().size() );	    return;	}    }    if ( obj->inherits( "QLayout" ) ) {	if ( prop == "spacing" ) {	    MetaDataBase::setSpacing( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)obj ) ), v.toInt() );	    return;	}	if ( prop == "margin" ) {	    MetaDataBase::setMargin( WidgetFactory::containerOfWidget( WidgetFactory::layoutParent( (QLayout*)obj ) ), v.toInt() );	    return;	}    }    if ( prop == "name" ) {	if ( pasting ) {	    QString s = v.toString();	    formwindow->unify( (QWidget*)obj, s, TRUE );	    obj->setName( s );	    return;	} else if ( formwindow && obj == formwindow->mainContainer() ) {	    formwindow->setName( v.toCString() );	}    }    if ( prop == "sizePolicy" ) {	QSizePolicy sp = v.toSizePolicy();	sp.setHeightForWidth( ( (QWidget*)obj )->sizePolicy().hasHeightForWidth() );    }    obj->setProperty( prop, v );}QString Resource::saveInCollection( const QImage &img ){    QString imgName = "none";    QValueList<Image>::Iterator it = images.begin();    for ( ; it != images.end(); ++it ) {	if ( img == ( *it ).img ) {	    imgName = ( *it ).name;	    break;	}    }    if ( imgName == "none" ) {	Image i;	imgName = "image" + QString::number( images.count() );	i.name = imgName;	i.img = img;	images.append( i );    }    return imgName;}void Resource::saveImageData( const QImage &img, QTextStream &ts, int indent ){    QByteArray ba;    QBuffer buf( ba );    buf.open( IO_WriteOnly );    QImageIO iio( &buf, "XPM" );    iio.setImage( img );    iio.write();    buf.close();    ulong len = ba.size() * 2;    QByteArray bazip( len );    ::compress(  (uchar*) bazip.data(), &len, (uchar*) ba.data(), ba.size() );    QString res;    ts << makeIndent( indent ) << "<data format=\"XPM.GZ\" length=\"" << ba.size() << "\">";    static const char hexchars[] = "0123456789abcdef";    for ( int i = 0; i < (int)len; ++i ) {	uchar s = (uchar) bazip[i];	ts << hexchars[s >> 4];	ts << hexchars[s & 0x0f];    }    ts << "</data>" << endl;}void Resource::saveImageCollection( QTextStream &ts, int indent ){    ts << makeIndent( indent ) << "<images>" << endl;    indent++;    QValueList<Image>::Iterator it = images.begin();    for ( ; it != images.end(); ++it ) {	ts << makeIndent( indent ) << "<image name=\"" << (*it).name << "\">" << endl;	indent++;	saveImageData( (*it).img, ts, indent );	indent--;	ts << makeIndent( indent ) << "</image>" << endl;    }    indent--;    ts << makeIndent( indent ) << "</images>" << endl;}static QImage loadImageData( QDomElement &n2 ){    QImage img;    QString data = n2.firstChild().toText().data();    char *ba = new char[ data.length() / 2 ];    for ( int i = 0; i < (int)data.length() / 2; ++i ) {	char h = data[ 2 * i ].latin1();	char l = data[ 2 * i  + 1 ].latin1();	uchar r = 0;	if ( h <= '9' )	    r += h - '0';	else	    r += h - 'a' + 10;	r = r << 4;	if ( l <= '9' )	    r += l - '0';	else	    r += l - 'a' + 10;	ba[ i ] = r;    }    QString format = n2.attribute( "format", "PNG" );    if ( format == "XPM.GZ" ) {	ulong len = n2.attribute( "length" ).toULong();	if ( len < data.length() * 5 )	    len = data.length() * 5;	QByteArray baunzip( len );	::uncompress( (uchar*) baunzip.data(), &len, (uchar*) ba, data.length()/2 );	img.loadFromData( (const uchar*)baunzip.data(), len, "XPM" );    }  else {	img.loadFromData( (const uchar*)ba, data.length() / 2, format );    }    delete [] ba;    return img;}void Resource::loadImageCollection( const QDomElement &e ){    QDomElement n = e.firstChild().toElement();    while ( !n.isNull() ) {	if ( n.tagName() == "image" ) {	    Image img;	    img.name =  n.attribute( "name" );	    QDomElement n2 = n.firstChild().toElement();	    while ( !n2.isNull() ) {		if ( n2.tagName() == "data" )		    img.img = loadImageData( n2 );		n2 = n2.nextSibling().toElement();	    }	    images.append( img );	    n = n.nextSibling().toElement();	}    }}QImage Resource::loadFromCollection( const QString &name ){    QValueList<Image>::Iterator it = images.begin();    for ( ; it != images.end(); ++it ) {	if ( ( *it ).name == name )	    return ( *it ).img;    }    return QImage();}void Resource::saveConnections( QTextStream &ts, int indent ){    ts << makeIndent( indent ) << "<connections>" << endl;    indent++;    QValueList<MetaDataBase::Connection> connections = MetaDataBase::connections( formwindow );    QValueList<MetaDataBase::Connection>::Iterator it = connections.begin();    for ( ; it != connections.end(); ++it ) {	MetaDataBase::Connection conn = *it;	if ( ( knownNames.findIndex( QString( conn.sender->name() ) ) == -1 &&	       qstrcmp( conn.sender->name(), "this" ) != 0 ) ||	     ( knownNames.findIndex( QString( conn.receiver->name() ) ) == -1 &&	       qstrcmp( conn.receiver->name(), "this" ) != 0 ) )	    continue;	if ( formwindow->isMainContainer( (QWidget*)(*it).receiver ) &&	     !MetaDataBase::hasSlot( formwindow, MetaDataBase::normalizeSlot( (*it).slot ).latin1() ) )	    continue;	if ( conn.sender->inherits( "CustomWidget" ) ) {	    MetaDataBase::CustomWidget *cw = ( (CustomWidget*)conn.sender )->customWidget();	    if ( cw && !cw->hasSignal( conn.signal ) )		continue;	}	if ( conn.receiver->inherits( "CustomWidget" ) && !formwindow->isMainContainer( conn.receiver ) ) {	    MetaDataBase::CustomWidget *cw = ( (CustomWidget*)conn.receiver )->customWidget();	    if ( cw && !cw->hasSlot( MetaDataBase::normalizeSlot( conn.slot ).latin1() ) )		continue;	}	ts << makeIndent( indent ) << "<connection>" << endl;	indent++;	ts << makeIndent( indent ) << "<sender>" << entitize( conn.sender->name() ) << "</sender>" << endl;	ts << makeIndent( indent ) << "<signal>" << entitize( conn.signal ) << "</signal>" << endl;	ts << makeIndent( indent ) << "<receiver>" << entitize( conn.receiver->name() ) << "</receiver>" << endl;	ts << makeIndent( indent ) << "<slot>" << entitize( MetaDataBase::normalizeSlot( conn.slot ) ) << "</slot>" << endl;	indent--;	ts << makeIndent( indent ) << "</connection>" << endl;    }    QString lang = formwindow->project()->language();    LanguageInterface *iface = langIface;    if ( iface && MetaDataBase::hasEvents( lang ) ) {	QObjectList *l = formwindow->queryList( "QWidget" );	l->append( formwindow );	QPtrList<QAction> lst = formwindow->actionList();	for ( QAction *a = lst.first(); a; a = lst.next() )	    l->append( a );	for ( QObject *o = l->first(); o; o = l->next() ) {	    if ( !MetaDataBase::hasObject( o ) )		continue;	    QMap<QString, QStringList> eventFunctions = MetaDataBase::eventFunctions( o );	    QMap<QString, QStringList>::ConstIterator it = eventFunctions.begin();	    for ( ; it != eventFunctions.end(); ++it ) {		QString sls = (*it).join( "," );		MetaDataBase::Connection conn;		conn.sender = o;		conn.signal = it.key();		conn.slot = sls;		langConnections[ lang ].append( conn );	    }	}	delete l;    }    indent--;    ts << makeIndent( indent ) << "</connections>" << endl;}void Resource::loadConnections( const QDomElement &e ){    QDomElement n = e.firstChild().toElement();    while ( !n.isNull() ) {	if ( n.tagName() == "connection" ) {	    QString lang = n.attribute( "language", "C+

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?