qdesigner.cpp

来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 273 行

CPP
273
字号
/******************************************************************************** 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.******************************************************************************/// designer#include "qdesigner.h"#include "qdesigner_actions.h"#include "qdesigner_server.h"#include "qdesigner_settings.h"#include "qdesigner_workbench.h"#include "qdesigner_toolwindow.h"#include <QtGui/QFileOpenEvent>#include <QtGui/QCloseEvent>#include <QtGui/QMessageBox>#include <QtGui/QIcon>#include <QtGui/QErrorMessage>#include <QtCore/QMetaObject>#include <QtCore/QFile>#include <QtCore/QLibraryInfo>#include <QtCore/QLocale>#include <QtCore/QTimer>#include <QtCore/QTranslator>#include <QtCore/qdebug.h>#include <QtDesigner/QDesignerComponents>static const char *designerApplicationName = "Designer";static const char *designerWarningPrefix = "Designer: ";static void designerMessageHandler(QtMsgType type, const char *msg){    // Only Designer warnings are displayed as box    QDesigner *designerApp = qDesigner;    if (type != QtWarningMsg || !designerApp || qstrncmp(designerWarningPrefix, msg, qstrlen(designerWarningPrefix))) {        qInstallMsgHandler(0);        qt_message_output(type, msg);        qInstallMsgHandler (designerMessageHandler);        return;    }    designerApp->showErrorMessage(msg);}QDesigner::QDesigner(int &argc, char **argv)    : QApplication(argc, argv),      m_server(0),      m_client(0),      m_workbench(0), m_suppressNewFormShow(false){    setOrganizationName(QLatin1String("Trolltech"));    setApplicationName(QLatin1String(designerApplicationName));    QDesignerComponents::initializeResources();#ifndef Q_WS_MAC    setWindowIcon(QIcon(QLatin1String(":/trolltech/designer/images/designer.png")));#endif    initialize();}QDesigner::~QDesigner(){    if (m_workbench)        delete m_workbench;    if (m_server)        delete m_server;    if (m_client)        delete m_client;}void QDesigner::showErrorMessage(const char *message){    // strip the prefix    const QString qMessage = QString::fromUtf8(message + qstrlen(designerWarningPrefix));    // If there is no main window yet, just store the message.    // The QErrorMessage would otherwise be hidden by the main window.    if (m_mainWindow) {        showErrorMessageBox(qMessage);    } else {        qInstallMsgHandler(0);        qt_message_output(QtWarningMsg, message); // just in case we crash        qInstallMsgHandler (designerMessageHandler);        m_initializationErrors += qMessage;        m_initializationErrors += QLatin1Char('\n');    }}void QDesigner::showErrorMessageBox(const QString &msg){    // Manually suppress consecutive messages.    // This happens if for example sth is wrong with custom widget creation.    // The same warning will be displayed by Widget box D&D and form Drop    // while trying to create instance.    if (m_errorMessageDialog && m_lastErrorMessage == msg)        return;    if (!m_errorMessageDialog) {        m_lastErrorMessage.clear();        m_errorMessageDialog = new QErrorMessage(m_mainWindow);        const QString title = QObject::tr("%1 - warning").arg(QLatin1String(designerApplicationName));        m_errorMessageDialog->setWindowTitle(title);        m_errorMessageDialog->setMinimumSize(QSize(600, 250));        m_errorMessageDialog->setWindowFlags(m_errorMessageDialog->windowFlags() & ~Qt::WindowContextHelpButtonHint);    }    m_errorMessageDialog->showMessage(msg);    m_lastErrorMessage = msg;}QDesignerWorkbench *QDesigner::workbench() const{    return m_workbench;}QDesignerServer *QDesigner::server() const{    return m_server;}void QDesigner::initialize(){    // initialize the sub components    QStringList files;    QString resourceDir = QLibraryInfo::location(QLibraryInfo::TranslationsPath);    const QStringList args = arguments();    for (int i = 1; i < args.count(); ++i)    {        const QString argument = args.at(i);        if (argument == QLatin1String("-server")) {            m_server = new QDesignerServer();            printf("%d\n", m_server->serverPort());            fflush(stdout);        } else if (argument == QLatin1String("-client")) {            bool ok = true;            if (i + 1 < args.count()) {                const quint16 port = args.at(++i).toUShort(&ok);                if (ok)                    m_client = new QDesignerClient(port, this);            }        } else if (argument == QLatin1String("-resourcedir")) {            if (i + 1 < args.count()) {                resourceDir = QFile::decodeName(args.at(++i).toLocal8Bit());            } else {                // issue a warning            }        } else if (!files.contains(argument)) {            files.append(argument);        }    }    QTranslator *translator = new QTranslator(this);    QTranslator *qtTranslator = new QTranslator(this);    const QString localSysName = QLocale::system().name();    QString  translatorFileName = QLatin1String("designer_");    translatorFileName += localSysName;    translator->load(translatorFileName, resourceDir);    translatorFileName = QLatin1String("qt_");    translatorFileName += localSysName;    qtTranslator->load(translatorFileName, resourceDir);    installTranslator(translator);    installTranslator(qtTranslator);    if (QLibraryInfo::licensedProducts() == QLatin1String("Console")) {        QMessageBox::information(0, tr("Qt Designer"),                tr("This application cannot be used for the Console edition of Qt"));        QMetaObject::invokeMethod(this, "quit", Qt::QueuedConnection);        return;    }    m_workbench = new QDesignerWorkbench();    emit initialized();    m_suppressNewFormShow = m_workbench->readInBackup();    foreach (QString file, files) {        m_workbench->readInForm(file);    }    if ( m_workbench->formWindowCount())        m_suppressNewFormShow = true;    // Show up error box with parent now if something went wrong    if (m_initializationErrors.isEmpty()) {        if (!m_suppressNewFormShow && QDesignerSettings().showNewFormOnStartup())            QTimer::singleShot(100, this, SLOT(callCreateForm())); // won't show anything if suppressed    } else {        showErrorMessageBox(m_initializationErrors);        m_initializationErrors.clear();    }    qInstallMsgHandler (designerMessageHandler);}bool QDesigner::event(QEvent *ev){    bool eaten;    switch (ev->type()) {    case QEvent::FileOpen:        // Set it true first since, if it's a Qt 3 form, the messagebox from convert will fire the timer.        m_suppressNewFormShow = true;        if (!m_workbench->readInForm(static_cast<QFileOpenEvent *>(ev)->file()))            m_suppressNewFormShow = false;        eaten = true;        break;    case QEvent::Close: {        QCloseEvent *closeEvent = static_cast<QCloseEvent *>(ev);        closeEvent->setAccepted(m_workbench->handleClose());        if (closeEvent->isAccepted()) {            // We're going down, make sure that we don't get our settings saved twice.            if (m_mainWindow)                m_mainWindow->setSaveSettingsOnClose(false);            eaten = QApplication::event(ev);        }        eaten = true;        break;    }    default:        eaten = QApplication::event(ev);        break;    }    return eaten;}void QDesigner::setMainWindow(QDesignerToolWindow *tw){    m_mainWindow = tw;}QDesignerToolWindow *QDesigner::mainWindow() const{    return m_mainWindow;}void QDesigner::callCreateForm(){    if (!m_suppressNewFormShow)        m_workbench->actionManager()->createForm();}

⌨️ 快捷键说明

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