formscriptrunner.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 199 行
CPP
199 行
/******************************************************************************** Copyright (C) 1992-2007 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://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** 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 "formscriptrunner_p.h"#include "ui4_p.h"#include "private/qobject_p.h"#include <QtScript/QScriptEngine>#include <QtGui/QWidget>#include <QtCore/QDebug>#include <QtCore/QCoreApplication>namespace { enum { debugFormScriptRunner = 0 };}#ifdef QFORMINTERNAL_NAMESPACEnamespace QFormInternal {#endifclass QFormScriptRunner::QFormScriptRunnerPrivate {public: QFormScriptRunnerPrivate() : m_options(DisableScripts) {} void clearErrors() { m_errors.clear(); } bool run(const QString &script, QWidget *widget, const WidgetList &children, QString *errorMessage); static void initializeEngine(QWidget *w, const WidgetList &children, QScriptEngine &scriptEngine); static QString engineError(QScriptEngine &scriptEngine); Options options() const { return m_options; } void setOptions(Options options) { m_options = options; } Errors errors() const { return m_errors; }private: QScriptEngine m_scriptEngine; Options m_options; Errors m_errors;};bool QFormScriptRunner::QFormScriptRunnerPrivate::run(const QString &script, QWidget *widget, const WidgetList &children, QString *errorMessage) { bool rc = false; initializeEngine(widget, children, m_scriptEngine); do { m_scriptEngine.evaluate(script); if (m_scriptEngine.hasUncaughtException ()) { *errorMessage = QCoreApplication::tr("Exception at line %1: %2").arg(m_scriptEngine.uncaughtExceptionLineNumber()).arg(engineError(m_scriptEngine)); break; } rc = true; } while (false); m_scriptEngine.popContext(); if (!rc) { Error error; error.objectName = widget->objectName(); error.script = script; error.errorMessage = *errorMessage; m_errors.push_back(error); } return rc;}void QFormScriptRunner::QFormScriptRunnerPrivate::initializeEngine(QWidget *w, const WidgetList &children, QScriptEngine &scriptEngine) { // Populate the script variables. This pushes a context which must be popped. QScriptContext *ctx = scriptEngine.pushContext(); QScriptValue widgetObject = scriptEngine.newQObject(w); QScriptValue childrenArray = scriptEngine.newArray (children.size()); for(int i = 0; i < children.size(); i++) { childrenArray.setProperty(i, scriptEngine.newQObject(children[i])); } ctx ->activationObject().setProperty(QLatin1String("widget"), widgetObject); ctx ->activationObject().setProperty(QLatin1String("childWidgets"), childrenArray);}QString QFormScriptRunner::QFormScriptRunnerPrivate::engineError(QScriptEngine &scriptEngine) { QScriptValue error = scriptEngine.evaluate(QLatin1String("Error")); if (error.isValid()) return error.toString(); return QCoreApplication::tr("Unknown error");}// -- QFormScriptRunnerQFormScriptRunner::QFormScriptRunner() : m_impl(new QFormScriptRunnerPrivate){}QFormScriptRunner::~QFormScriptRunner(){ delete m_impl;}bool QFormScriptRunner::run(const DomWidget *domWidget, const QString &customWidgetScript, QWidget *widget, const WidgetList &children, QString *errorMessage){ typedef QList<DomScript*> DomScripts; const Options scriptOptions = m_impl->options(); if (scriptOptions & DisableScripts) return true; // get list const DomScripts domScripts = domWidget->elementScript(); // Concatenate snippets, starting with custom widget script QString script = customWidgetScript; if (script.isEmpty() && domScripts.empty()) return true; foreach (const DomScript *scriptSnippet, domScripts) { // Ensure new line if (!script.isEmpty() && !script.endsWith(QLatin1Char('\n'))) script += QLatin1Char('\n'); script += scriptSnippet->text(); } if (script.isEmpty()) return true; const bool rc = m_impl->run(script, widget, children, errorMessage); if (debugFormScriptRunner) { qDebug() << "For " << widget << " with " << children.size() << " children, ran: " << script; if (!rc) qDebug() << *errorMessage; } if (!rc) { if (!(scriptOptions & DisableWarnings)) { const QString message = QCoreApplication::tr("An error occurred while running the script for %1: %2\nScript: %3"). arg(widget->objectName()).arg(*errorMessage).arg(script); qWarning() << message; } } return rc;}QFormScriptRunner::Options QFormScriptRunner::options() const{ return m_impl->options();}void QFormScriptRunner::setOptions(Options options){ m_impl->setOptions(options);}QFormScriptRunner::Errors QFormScriptRunner::errors() const{ return m_impl->errors();}void QFormScriptRunner::clearErrors(){ m_impl->clearErrors();}#ifdef QFORMINTERNAL_NAMESPACE} // namespace QFormInternal#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?