📄 qwidgetfactory.cpp
字号:
QPopupMenu *popupMenu = new QPopupMenu( menuBar->parentWidget(), name ); in >> objectTag; while ( !in.atEnd() && objectTag != Object_End ) { switch ( objectTag ) { case Object_ActionRef: unpackUInt16( in, actionNo ); ((QAction *) objects[actionNo])->addTo( popupMenu ); break; case Object_Separator: popupMenu->insertSeparator(); break; default: qFatal( "Corrupt" ); } in >> objectTag; } menuBar->insertItem( translate(text), popupMenu );}QObject *QWidgetFactory::inputObject( QObject **objects, int& numObjects, const UibStrTable& strings, QDataStream& in, QWidget *ancestorWidget, QObject *parent, QCString className ){ QObject *obj = 0; QWidget *widget = 0; QLayout *layout = 0; QWidget *parentWidget = 0; QLayout *parentLayout = 0; bool isQObject = !className.isEmpty(); if ( isQObject ) { if ( parent != 0 ) { if ( parent->isWidgetType() ) { if ( parent->inherits("QMainWindow") ) { parentWidget = ((QMainWindow *) parent)->centralWidget(); } else { parentWidget = (QWidget *) parent; } } else if ( parent->inherits("QLayout") ) { parentLayout = (QLayout *) parent; parentWidget = ancestorWidget; } } if ( className == "QAction" ) { unpackCString( strings, in, className ); if ( className == "QActionGroup" ) { obj = new QActionGroup( parent ); } else { obj = new QAction( parent ); } } else if ( className == "QLayout" ) { unpackCString( strings, in, className ); LayoutType type = Grid; if ( className == "QHBoxLayout" ) { type = HBox; } else if ( className == "QVBoxLayout" ) { type = VBox; } if ( parentLayout != 0 && parentLayout->inherits("QGridLayout") ) { layout = createLayout( 0, 0, type ); } else { layout = createLayout( parentWidget, parentLayout, type ); } obj = layout; } else if ( className == "QMenuBar" ) { unpackCString( strings, in, className ); widget = ((QMainWindow *) parent)->menuBar(); obj = widget; } else if ( className == "QToolBar" ) { Q_UINT8 dock; in >> dock; unpackCString( strings, in, className ); widget = new QToolBar( QString::null, (QMainWindow *) parent, (Qt::Dock) dock ); obj = widget; } else if ( className == "QWidget" ) { unpackCString( strings, in, className ); widget = createWidget( className, parentWidget, 0 ); obj = widget; } if ( widget != 0 ) ancestorWidget = widget; d->lastItem = 0; objects[numObjects++] = obj; } QCString name; QVariant value; QCString comment; QString str; Q_UINT16 actionNo; int metAttribute = 0; Q_UINT16 column = 0; Q_UINT16 row = 0; Q_UINT16 colspan = 1; Q_UINT16 rowspan = 1; Q_UINT8 paletteTag; Q_UINT8 objectTag; in >> objectTag; while ( !in.atEnd() && objectTag != Object_End ) { switch ( objectTag ) { case Object_ActionRef: unpackUInt16( in, actionNo ); ((QAction *) objects[actionNo])->addTo( (QToolBar *) widget ); break; case Object_Attribute: metAttribute = 2; break; case Object_Column: inputColumnOrRow( strings, in, obj, FALSE ); break; case Object_Event: unpackCString( strings, in, name ); unpackVariant( strings, in, value ); // ### do something with value.asStringList() break; case Object_FontProperty: { QFont font; QString family; Q_UINT16 pointSize; Q_UINT8 fontFlags; unpackCString( strings, in, name ); in >> fontFlags; if ( fontFlags & Font_Family ) { unpackString( strings, in, family ); font.setFamily( family ); } if ( fontFlags & Font_PointSize ) { unpackUInt16( in, pointSize ); font.setPointSize( pointSize ); } if ( fontFlags & Font_Bold ) font.setBold( TRUE ); if ( fontFlags & Font_Italic ) font.setItalic( TRUE ); if ( fontFlags & Font_Underline ) font.setUnderline( TRUE ); if ( fontFlags & Font_StrikeOut ) font.setStrikeOut( TRUE ); if ( obj != 0 ) setProperty( obj, name, font ); } break; case Object_GridCell: unpackUInt16( in, column ); unpackUInt16( in, row ); unpackUInt16( in, colspan ); unpackUInt16( in, rowspan ); break; case Object_Item: inputItem( strings, in, obj ); break; case Object_MenuItem: inputMenuItem( objects, strings, in, (QMenuBar *) widget ); break; case Object_PaletteProperty: { QPalette palette; QColorGroup colorGroup; QColor color; int role = -1; unpackCString( strings, in, name ); in >> paletteTag; while ( !in.atEnd() && paletteTag != Palette_End ) { switch ( paletteTag ) { case Palette_Active: palette.setActive( colorGroup ); role = -1; break; case Palette_Inactive: palette.setInactive( colorGroup ); role = -1; break; case Palette_Disabled: palette.setDisabled( colorGroup ); role = -1; break; case Palette_Color: role++; in >> color; colorGroup.setColor( (QColorGroup::ColorRole) role, color ); break; case Palette_Pixmap: unpackVariant( strings, in, value ); colorGroup.setBrush( (QColorGroup::ColorRole) role, QBrush(color, value.asPixmap()) ); break; default: qFatal( "Corrupt" ); } in >> paletteTag; } if ( obj != 0 ) setProperty( obj, name, palette ); } break; case Object_Row: inputColumnOrRow( strings, in, obj, TRUE ); break; case Object_Spacer: inputSpacer( strings, in, layout ); break; case Object_Separator: ((QToolBar *) widget)->addSeparator(); break; case Object_SubAction: inputObject( objects, numObjects, strings, in, parentWidget, obj != 0 ? obj : parent, "QAction" ); break; case Object_SubLayout: inputObject( objects, numObjects, strings, in, parentWidget, obj, "QLayout" ); break; case Object_SubWidget: inputObject( objects, numObjects, strings, in, parentWidget, obj, "QWidget" ); break; case Object_TextProperty: unpackCString( strings, in, name ); unpackCString( strings, in, value.asCString() ); unpackCString( strings, in, comment ); str = translate( value.asCString(), comment ); if ( metAttribute > 0 ) { if ( name == "title" ) { if ( parent != 0 ) { if ( parent->inherits("QTabWidget") ) { ((QTabWidget *) parent)->insertTab( widget, str ); } else if ( parent->inherits("QWizard") ) { ((QWizard *) parent)->addPage( widget, str ); } } } } else { if ( obj != 0 ) setProperty( obj, name, str ); } break; case Object_VariantProperty: unpackCString( strings, in, name ); unpackVariant( strings, in, value ); if ( metAttribute > 0 ) { if ( name == "id" ) { if ( parent != 0 && parent->inherits("QWidgetStack") ) ((QWidgetStack *) parent)->addWidget( widget, value.toInt() ); } } else { if ( obj != 0 ) setProperty( obj, name, value ); } break; default: qFatal( "Corrupt" ); } in >> objectTag; metAttribute--; } if ( parentLayout != 0 ) { if ( widget != 0 ) { if ( parentLayout->inherits("QGridLayout") ) { ((QGridLayout *) parentLayout)->addMultiCellWidget( widget, row, row + rowspan - 1, column, column + colspan - 1 ); } else { ((QBoxLayout *) parentLayout)->addWidget( widget ); } } else if ( layout != 0 ) { if ( parentLayout->inherits("QGridLayout") ) { ((QGridLayout *) parentLayout)->addMultiCellLayout( layout, row, row + rowspan - 1, column, column + colspan - 1 ); } } } return obj;}QWidget *QWidgetFactory::createFromUibFile( QDataStream& in, QObject * /* connector */ , QWidget *parent, const char *name ){#define END_OF_BLOCK() \ ( in.atEnd() || in.device()->at() >= nextBlock ) Q_UINT8 lf; Q_UINT8 cr; in >> lf; in >> cr; if ( lf != '\n' || cr != '\r' ) { qWarning( "File corrupted" ); return 0; } Q_UINT8 qdatastreamVersion; in >> qdatastreamVersion; if ( (int) qdatastreamVersion > in.version() ) { qWarning( "Incompatible version of Qt" ); return 0; } in.setVersion( qdatastreamVersion ); UibStrTable strings; QObject **objects = 0; int numObjects = 0; Q_UINT8 blockType; Q_UINT32 blockSize; in >> blockType; while ( !in.atEnd() && blockType != Block_End ) { unpackUInt32( in, blockSize ); QIODevice::Offset nextBlock = in.device()->at() + blockSize; switch ( blockType ) { case Block_Actions: inputObject( objects, numObjects, strings, in, toplevel, toplevel ); break; case Block_Buddies: { Q_UINT16 labelNo; Q_UINT16 buddyNo; do { unpackUInt16( in, labelNo ); unpackUInt16( in, buddyNo ); QLabel *label = (QLabel *) objects[labelNo]->qt_cast( "QLabel" ); if ( label != 0 ) label->setBuddy( (QWidget *) objects[buddyNo] ); } while ( !END_OF_BLOCK() ); } break; case Block_Connections: { QString language = "C++"; Q_UINT16 senderNo = 0; QString signal = "clicked()"; Q_UINT16 receiverNo = 0; QString slot = "accept()"; Q_UINT8 connectionFlags; do { in >> connectionFlags; if ( connectionFlags & Connection_Language ) unpackString( strings, in, language ); if ( connectionFlags & Connection_Sender ) unpackUInt16( in, senderNo ); if ( connectionFlags & Connection_Signal ) unpackStringSplit( strings, in, signal ); if ( connectionFlags & Connection_Receiver ) unpackUInt16( in, receiverNo ); if ( connectionFlags & Connection_Slot ) unpackStringSplit( strings, in, slot ); // ####if 0 qWarning( "connect( %p, %s, %p, %s )", objects[senderNo], signal.latin1(), objects[receiverNo], slot.latin1() );#endif } while ( !END_OF_BLOCK() ); } break; case Block_Functions: // ### qWarning( "Block_Functions not supported" ); in.device()->at( nextBlock ); break; case Block_Images: { QString format; Q_UINT32 length; QByteArray data; Image image; do { unpackString( strings, in, image.name ); unpackString( strings, in, format ); unpackUInt32( in, length ); unpackByteArray( in, data ); image.img = loadImageData( format, length, data ); images += image; } while ( !END_OF_BLOCK() ); } break; case Block_Intro: { Q_INT16 defaultMargin; Q_INT16 defaultSpacing; Q_UINT16 maxObjects; Q_UINT8 introFlags; in >> introFlags; in >> defaultMargin; in >> defaultSpacing; unpackUInt16( in, maxObjects ); unpackCString( strings, in, d->translationContext ); if ( introFlags & Intro_Pixmapinproject ) usePixmapCollection = TRUE; if ( defaultMargin != -32768 ) defMargin = defaultMargin; if ( defaultSpacing != -32768 ) defSpacing = defaultSpacing; objects = new QObject *[maxObjects]; } break; case Block_Menubar: inputObject( objects, numObjects, strings, in, toplevel, toplevel, "QMenuBar" ); break; case Block_Slots: { QString language; QString slot; do { unpackString( strings, in, language ); unpackStringSplit( strings, in, slot ); } while ( !END_OF_BLOCK() ); } break; case Block_Strings: strings.readBlock( in, blockSize ); break; case Block_Tabstops: { Q_UINT16 beforeNo; Q_UINT16 afterNo; unpackUInt16( in, beforeNo ); while ( !END_OF_BLOCK() ) { unpackUInt16( in, afterNo ); toplevel->setTabOrder( (QWidget *) objects[beforeNo], (QWidget *) objects[afterNo] ); beforeNo = afterNo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -