📄 abstractformbuilder.cpp
字号:
/******************************************************************************** Copyright (C) 1992-2006 Trolltech ASA. All rights reserved.**** This file is part of the Qt Designer of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://www.trolltech.com/products/qt/opensource.html**** If you are unsure which license is appropriate for your use, please** review the following information:** http://www.trolltech.com/products/qt/licensing.html or contact the** sales department at sales@trolltech.com.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "abstractformbuilder.h"#include "ui4.h"#include <QtCore/QVariant>#include <QtCore/QMetaProperty>#include <QtCore/QDateTime>#include <QtCore/QFileInfo>#include <QtCore/QDir>#include <QtCore/QQueue>#include <QtGui/QAction>#include <QtGui/QActionGroup>#include <QtGui/QComboBox>#include <QtGui/QGridLayout>#include <QtGui/QIcon>#include <QtGui/QListWidget>#include <QtGui/QMainWindow>#include <QtGui/QPixmap>#include <QtGui/QShortcut>#include <QtGui/QStatusBar>#include <QtGui/QTreeWidget>#include <QtGui/QTableWidget>#include <QtGui/QWidget>#include <QtGui/QSplitter>#include <QtXml/QDomDocument>#include <QtGui/QDialog>// containers#include <QtGui/QToolBox>#include <QtGui/QStackedWidget>#include <QtGui/QTabWidget>#include <QtGui/QToolBar>#include <QtGui/QMenuBar>#include <QtGui/QDockWidget>#include <QtCore/qdebug.h>#include <limits.h>#ifdef QFORMINTERNAL_NAMESPACEusing namespace QFormInternal;#endifclass QFriendlyLayout: public QLayout{public: inline QFriendlyLayout() { Q_ASSERT(0); }#ifdef QFORMINTERNAL_NAMESPACE friend class QFormInternal::QAbstractFormBuilder;#else friend class QAbstractFormBuilder;#endif};class QAbstractFormBuilderGadget: public QWidget{ Q_OBJECT Q_PROPERTY(Qt::Orientation orientation READ fakeOrientation) Q_PROPERTY(QSizePolicy::Policy sizeType READ fakeSizeType) Q_PROPERTY(QPalette::ColorRole colorRole READ fakeColorRole) Q_PROPERTY(QPalette::ColorGroup colorGroup READ fakeColorGroup)public: QAbstractFormBuilderGadget() { Q_ASSERT(0); } Qt::Orientation fakeOrientation() const { Q_ASSERT(0); return Qt::Horizontal; } QSizePolicy::Policy fakeSizeType() const { Q_ASSERT(0); return QSizePolicy::Expanding; } QPalette::ColorGroup fakeColorGroup() const { Q_ASSERT(0); return static_cast<QPalette::ColorGroup>(0); } QPalette::ColorRole fakeColorRole() const { Q_ASSERT(0); return static_cast<QPalette::ColorRole>(0); }};#ifdef Q_WS_MACstatic struct { int key; const char* name;} keyname[] = { { Qt::Key_Space, QT_TRANSLATE_NOOP("QShortcut", "Space") }, { Qt::Key_Escape, QT_TRANSLATE_NOOP("QShortcut", "Esc") }, { Qt::Key_Tab, QT_TRANSLATE_NOOP("QShortcut", "Tab") }, { Qt::Key_Backtab, QT_TRANSLATE_NOOP("QShortcut", "Backtab") }, { Qt::Key_Backspace, QT_TRANSLATE_NOOP("QShortcut", "Backspace") }, { Qt::Key_Return, QT_TRANSLATE_NOOP("QShortcut", "Return") }, { Qt::Key_Enter, QT_TRANSLATE_NOOP("QShortcut", "Enter") }, { Qt::Key_Insert, QT_TRANSLATE_NOOP("QShortcut", "Ins") }, { Qt::Key_Delete, QT_TRANSLATE_NOOP("QShortcut", "Del") }, { Qt::Key_Pause, QT_TRANSLATE_NOOP("QShortcut", "Pause") }, { Qt::Key_Print, QT_TRANSLATE_NOOP("QShortcut", "Print") }, { Qt::Key_SysReq, QT_TRANSLATE_NOOP("QShortcut", "SysReq") }, { Qt::Key_Home, QT_TRANSLATE_NOOP("QShortcut", "Home") }, { Qt::Key_End, QT_TRANSLATE_NOOP("QShortcut", "End") }, { Qt::Key_Left, QT_TRANSLATE_NOOP("QShortcut", "Left") }, { Qt::Key_Up, QT_TRANSLATE_NOOP("QShortcut", "Up") }, { Qt::Key_Right, QT_TRANSLATE_NOOP("QShortcut", "Right") }, { Qt::Key_Down, QT_TRANSLATE_NOOP("QShortcut", "Down") }, { Qt::Key_PageUp, QT_TRANSLATE_NOOP("QShortcut", "PgUp") }, { Qt::Key_PageDown, QT_TRANSLATE_NOOP("QShortcut", "PgDown") }, { Qt::Key_CapsLock, QT_TRANSLATE_NOOP("QShortcut", "CapsLock") }, { Qt::Key_NumLock, QT_TRANSLATE_NOOP("QShortcut", "NumLock") }, { Qt::Key_ScrollLock, QT_TRANSLATE_NOOP("QShortcut", "ScrollLock") }, { Qt::Key_Menu, QT_TRANSLATE_NOOP("QShortcut", "Menu") }, { Qt::Key_Help, QT_TRANSLATE_NOOP("QShortcut", "Help") }, // Multimedia keys { Qt::Key_Back, QT_TRANSLATE_NOOP("QShortcut", "Back") }, { Qt::Key_Forward, QT_TRANSLATE_NOOP("QShortcut", "Forward") }, { Qt::Key_Stop, QT_TRANSLATE_NOOP("QShortcut", "Stop") }, { Qt::Key_Refresh, QT_TRANSLATE_NOOP("QShortcut", "Refresh") }, { Qt::Key_VolumeDown, QT_TRANSLATE_NOOP("QShortcut", "Volume Down") }, { Qt::Key_VolumeMute, QT_TRANSLATE_NOOP("QShortcut", "Volume Mute") }, { Qt::Key_VolumeUp, QT_TRANSLATE_NOOP("QShortcut", "Volume Up") }, { Qt::Key_BassBoost, QT_TRANSLATE_NOOP("QShortcut", "Bass Boost") }, { Qt::Key_BassUp, QT_TRANSLATE_NOOP("QShortcut", "Bass Up") }, { Qt::Key_BassDown, QT_TRANSLATE_NOOP("QShortcut", "Bass Down") }, { Qt::Key_TrebleUp, QT_TRANSLATE_NOOP("QShortcut", "Treble Up") }, { Qt::Key_TrebleDown, QT_TRANSLATE_NOOP("QShortcut", "Treble Down") }, { Qt::Key_MediaPlay, QT_TRANSLATE_NOOP("QShortcut", "Media Play") }, { Qt::Key_MediaStop, QT_TRANSLATE_NOOP("QShortcut", "Media Stop") }, { Qt::Key_MediaPrevious,QT_TRANSLATE_NOOP("QShortcut", "Media Previous") }, { Qt::Key_MediaNext, QT_TRANSLATE_NOOP("QShortcut", "Media Next") }, { Qt::Key_MediaRecord, QT_TRANSLATE_NOOP("QShortcut", "Media Record") }, { Qt::Key_HomePage, QT_TRANSLATE_NOOP("QShortcut", "Home") }, { Qt::Key_Favorites, QT_TRANSLATE_NOOP("QShortcut", "Favorites") }, { Qt::Key_Search, QT_TRANSLATE_NOOP("QShortcut", "Search") }, { Qt::Key_Standby, QT_TRANSLATE_NOOP("QShortcut", "Standby") }, { Qt::Key_OpenUrl, QT_TRANSLATE_NOOP("QShortcut", "Open URL") }, { Qt::Key_LaunchMail, QT_TRANSLATE_NOOP("QShortcut", "Launch Mail") }, { Qt::Key_LaunchMedia, QT_TRANSLATE_NOOP("QShortcut", "Launch Media") }, { Qt::Key_Launch0, QT_TRANSLATE_NOOP("QShortcut", "Launch (0)") }, { Qt::Key_Launch1, QT_TRANSLATE_NOOP("QShortcut", "Launch (1)") }, { Qt::Key_Launch2, QT_TRANSLATE_NOOP("QShortcut", "Launch (2)") }, { Qt::Key_Launch3, QT_TRANSLATE_NOOP("QShortcut", "Launch (3)") }, { Qt::Key_Launch4, QT_TRANSLATE_NOOP("QShortcut", "Launch (4)") }, { Qt::Key_Launch5, QT_TRANSLATE_NOOP("QShortcut", "Launch (5)") }, { Qt::Key_Launch6, QT_TRANSLATE_NOOP("QShortcut", "Launch (6)") }, { Qt::Key_Launch7, QT_TRANSLATE_NOOP("QShortcut", "Launch (7)") }, { Qt::Key_Launch8, QT_TRANSLATE_NOOP("QShortcut", "Launch (8)") }, { Qt::Key_Launch9, QT_TRANSLATE_NOOP("QShortcut", "Launch (9)") }, { Qt::Key_LaunchA, QT_TRANSLATE_NOOP("QShortcut", "Launch (A)") }, { Qt::Key_LaunchB, QT_TRANSLATE_NOOP("QShortcut", "Launch (B)") }, { Qt::Key_LaunchC, QT_TRANSLATE_NOOP("QShortcut", "Launch (C)") }, { Qt::Key_LaunchD, QT_TRANSLATE_NOOP("QShortcut", "Launch (D)") }, { Qt::Key_LaunchE, QT_TRANSLATE_NOOP("QShortcut", "Launch (E)") }, { Qt::Key_LaunchF, QT_TRANSLATE_NOOP("QShortcut", "Launch (F)") }, // -------------------------------------------------------------- // More consistent namings { Qt::Key_Print, QT_TRANSLATE_NOOP("QShortcut", "Print Screen") }, { Qt::Key_PageUp, QT_TRANSLATE_NOOP("QShortcut", "Page Up") }, { Qt::Key_PageDown, QT_TRANSLATE_NOOP("QShortcut", "Page Down") }, { Qt::Key_CapsLock, QT_TRANSLATE_NOOP("QShortcut", "Caps Lock") }, { Qt::Key_NumLock, QT_TRANSLATE_NOOP("QShortcut", "Num Lock") }, { Qt::Key_NumLock, QT_TRANSLATE_NOOP("QShortcut", "Number Lock") }, { Qt::Key_ScrollLock, QT_TRANSLATE_NOOP("QShortcut", "Scroll Lock") }, { Qt::Key_Insert, QT_TRANSLATE_NOOP("QShortcut", "Insert") }, { Qt::Key_Delete, QT_TRANSLATE_NOOP("QShortcut", "Delete") }, { Qt::Key_Escape, QT_TRANSLATE_NOOP("QShortcut", "Escape") }, { Qt::Key_SysReq, QT_TRANSLATE_NOOP("QShortcut", "System Request") }, { 0, 0 }};static QString qkeysequence_encodeString(int key){ QString s; if ((key & Qt::META) == Qt::META) s += QShortcut::tr("Meta"); if ((key & Qt::CTRL) == Qt::CTRL) { if (!s.isEmpty()) s += QShortcut::tr("+"); s += QShortcut::tr("Ctrl"); } if ((key & Qt::ALT) == Qt::ALT) { if (!s.isEmpty()) s += QShortcut::tr("+"); s += QShortcut::tr("Alt"); } if ((key & Qt::SHIFT) == Qt::SHIFT) { if (!s.isEmpty()) s += QShortcut::tr("+"); s += QShortcut::tr("Shift"); } key &= ~(Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier); QString p; if (key && key < Qt::Key_Escape) { if (key < 0x10000) { p = QChar(key & 0xffff).toUpper(); } else { p = QChar((key-0x10000)/0x400+0xd800); p += QChar((key-0x10000)%400+0xdc00); } } else if (key >= Qt::Key_F1 && key <= Qt::Key_F35) { p = QShortcut::tr("F%1").arg(key - Qt::Key_F1 + 1); } else if (key > Qt::Key_Space && key <= Qt::Key_AsciiTilde) { p.sprintf("%c", key); } else if (key) { int i=0; while (keyname[i].name) { if (key == keyname[i].key) { p = QShortcut::tr(keyname[i].name); break; } ++i; } // If we can't find the actual translatable keyname, // fall back on the unicode representation of it... // Or else characters like Qt::Key_aring may not get displayed // (Really depends on you locale) if (!keyname[i].name) { if (key < 0x10000) { p = QChar(key & 0xffff).toUpper(); } else { p = QChar((key-0x10000)/0x400+0xd800); p += QChar((key-0x10000)%400+0xdc00); } } } if (!s.isEmpty()) s += QShortcut::tr("+"); s += p; return s;}static QString platformNeutralKeySequence(const QKeySequence &ks){ uint k; QString str; for (k = 0; k < ks.count(); ++k) { str += qkeysequence_encodeString(ks[k]) + ", "; } str.truncate(str.size() - 2); return str;}#endif/*! \class QAbstractFormBuilder \brief The QAbstractFormBuilder class provides a default implementation for classes that create user interfaces at run-time. \inmodule QtDesigner QAbstractFormBuilder provides a standard interface and a default implementation for constructing forms from user interface files. It is not intended to be instantiated directly. Use the QFormBuilder class to create user interfaces from \c{.ui} files at run-time. For example: \code MyForm::MyForm(QWidget *parent) : QWidget(parent) { QFormBuilder builder; QFile file(":/forms/myWidget.ui"); file.open(QFile::ReadOnly); QWidget *myWidget = builder.load(&file, this); file.close(); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(myWidget); setLayout(layout); } \endcode To override certain aspects of the form builder's behavior, subclass QAbstractFormBuilder and reimplement the relevant virtual functions: \list \o load() handles reading of \c{.ui} format files from arbitrary QIODevices, and construction of widgets from the XML data that they contain. \o save() handles saving of widget details in \c{.ui} format to arbitrary QIODevices. \o workingDirectory() and setWorkingDirectory() control the directory in which forms are held. The form builder looks for other resources on paths relative to this directory. \endlist The QFormBuilder class is typically used by custom components and applications that embed \QD. Standalone applications that need to dynamically generate user interfaces at run-time use the QUiLoader, found in the QtUiTools module. \sa {QtUiTools Module}*//*! Constructs a new form builder.*/QAbstractFormBuilder::QAbstractFormBuilder(){ m_defaultMargin = INT_MIN; m_defaultSpacing = INT_MIN;}/*! Destroys the form builder.*/QAbstractFormBuilder::~QAbstractFormBuilder(){}/*! \fn QWidget *QAbstractFormBuilder::load(QIODevice *device, QWidget *parent) Loads an XML representation of a widget from the given \a device, and constructs a new widget with the specified \a parent. \sa save()*/QWidget *QAbstractFormBuilder::load(QIODevice *dev, QWidget *parentWidget){ QDomDocument doc; if (!doc.setContent(dev)) return 0; QDomElement root = doc.firstChild().toElement(); DomUI ui; ui.read(root); /// ### check the result return create(&ui, parentWidget);}/*! \internal*/QWidget *QAbstractFormBuilder::create(DomUI *ui, QWidget *parentWidget){ if (DomLayoutDefault *def = ui->elementLayoutDefault()) { m_defaultMargin = def->hasAttributeMargin() ? def->attributeMargin() : INT_MIN; m_defaultSpacing = def->hasAttributeSpacing() ? def->attributeSpacing() : INT_MIN; } DomWidget *ui_widget = ui->elementWidget(); if (!ui_widget) return 0; createCustomWidgets(ui->elementCustomWidgets()); if (QWidget *widget = create(ui_widget, parentWidget)) { createConnections(ui->elementConnections(), widget); createResources(ui->elementResources()); applyTabStops(widget, ui->elementTabStops()); reset(); return widget; } return 0;}/*! \internal*/QWidget *QAbstractFormBuilder::create(DomWidget *ui_widget, QWidget *parentWidget){ QWidget *w = createWidget(ui_widget->attributeClass(), parentWidget, ui_widget->attributeName()); if (!w) return 0; applyProperties(w, ui_widget->elementProperty()); foreach (DomAction *ui_action, ui_widget->elementAction()) { QAction *child_action = create(ui_action, w); Q_UNUSED( child_action ); } foreach (DomActionGroup *ui_action_group, ui_widget->elementActionGroup()) { QActionGroup *child_action_group = create(ui_action_group, w); Q_UNUSED( child_action_group ); } foreach (DomWidget *ui_child, ui_widget->elementWidget()) { QWidget *child_w = create(ui_child, w); Q_UNUSED( child_w ); } foreach (DomLayout *ui_lay, ui_widget->elementLayout()) { QLayout *child_lay = create(ui_lay, 0, w); Q_UNUSED( child_lay );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -