newform.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 335 行
CPP
335 行
/******************************************************************************** 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 "newform.h"#include "qdesigner_workbench.h"#include "qdesigner_actions.h"#include "qdesigner_formwindow.h"#include "qdesigner_settings.h"#include <qdesigner_formbuilder_p.h>#include <sheet_delegate_p.h>#include <QtDesigner/QDesignerFormEditorInterface>#include <QtDesigner/QDesignerFormWindowInterface>#include <QtDesigner/QExtensionManager>#include <QtDesigner/QDesignerLanguageExtension>#include <QtCore/QDir>#include <QtCore/QFile>#include <QtCore/QFileInfo>#include <QtCore/qdebug.h>#include <QtGui/QHeaderView>#include <QtGui/QPainter>#include <QtGui/QPushButton>#include <QtGui/QMenu>#include <QtGui/QMessageBox>enum NewForm_CustomRole { TemplateNameRole = Qt::UserRole + 100 };NewForm::NewForm(QDesignerWorkbench *workbench, QWidget *parentWidget, const QString &fileName) : QDialog(parentWidget,#ifdef Q_WS_MAC Qt::Tool |#endif Qt::WindowTitleHint | Qt::WindowSystemMenuHint), m_workbench(workbench), m_createButton(new QPushButton(QApplication::translate("NewForm", "C&reate", 0, QApplication::UnicodeUTF8))), m_recentButton(new QPushButton(QApplication::translate("NewForm", "Recent", 0, QApplication::UnicodeUTF8))), m_fileName(fileName){ ui.setupUi(this); ui.treeWidget->setItemDelegate(new qdesigner_internal::SheetDelegate(ui.treeWidget, this)); ui.treeWidget->header()->hide(); ui.treeWidget->header()->setStretchLastSection(true); ui.lblPreview->setBackgroundRole(QPalette::Base); ui.chkShowOnStartup->setChecked(QDesignerSettings().showNewFormOnStartup()); ui.buttonBox->clear(); ui.buttonBox->addButton(QApplication::translate("NewForm", "&Close", 0, QApplication::UnicodeUTF8), QDialogButtonBox::RejectRole); ui.buttonBox->addButton(m_createButton, QDialogButtonBox::AcceptRole); m_createButton->setEnabled(false); ui.buttonBox->addButton(QApplication::translate("NewForm", "&Open...", 0, QApplication::UnicodeUTF8), QDialogButtonBox::ActionRole); ui.buttonBox->addButton(m_recentButton, QDialogButtonBox::ActionRole); QDesignerActions *da = workbench->actionManager(); QMenu *recentFilesMenu = new QMenu(tr("&Recent Forms"), m_recentButton); // Pop the "Recent Files" stuff in here. foreach(QAction *recentAction, da->recentFilesActions()->actions()) { recentFilesMenu->addAction(recentAction); connect(recentAction, SIGNAL(triggered()), this, SLOT(recentFileChosen())); } m_recentButton->setMenu(recentFilesMenu); QString uiExtension = QLatin1String("ui"); QString templatePath = QLatin1String(":/trolltech/designer/templates/forms"); QDesignerLanguageExtension *lang = qt_extension<QDesignerLanguageExtension *>(workbench->core()->extensionManager(), workbench->core()); if (lang) { templatePath = QLatin1String(":/templates/forms"); uiExtension = lang->uiExtension(); } loadFrom(templatePath, true, uiExtension); QDesignerSettings settings; foreach(QString path, settings.formTemplatePaths()) loadFrom(path, false, uiExtension);}NewForm::~NewForm(){ QDesignerSettings().setShowNewFormOnStartup(ui.chkShowOnStartup->isChecked());}void NewForm::recentFileChosen(){ QAction *action = qobject_cast<QAction *>(sender()); if (!action) return; if (action->objectName() == QLatin1String("__qt_action_clear_menu_")) return; close();}void NewForm::on_treeWidget_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *){ if (current && current->parent()) { const QPixmap pixmap = formPreviewPixmap(current->data(0, TemplateNameRole).toString()); if (pixmap.isNull()) { m_createButton->setEnabled(false); ui.lblPreview->setText(tr("Error loading form")); } else { m_createButton->setEnabled(true); m_createButton->setDefault(true); ui.lblPreview->setPixmap(pixmap); } } else { m_createButton->setEnabled(false); ui.lblPreview->setText(tr("Choose a template for a preview")); }}void NewForm::on_treeWidget_itemActivated(QTreeWidgetItem *item){ if (item->data(0, TemplateNameRole).isValid()) m_createButton->animateClick(0);}void NewForm::on_buttonBox_clicked(QAbstractButton *btn){ switch (ui.buttonBox->buttonRole(btn)) { case QDialogButtonBox::RejectRole: reject(); break; case QDialogButtonBox::ActionRole: if (btn != m_recentButton) { m_fileName.clear(); if (m_workbench->actionManager()->openForm(this)) accept(); } break; case QDialogButtonBox::AcceptRole: if (const QTreeWidgetItem *item = ui.treeWidget->currentItem()) { if (openTemplate(item->data(0, TemplateNameRole).toString())) accept(); } break; default: break; }}QDesignerWorkbench *NewForm::workbench() const{ return m_workbench;}QPixmap NewForm::formPreviewPixmap(const QString &fileName){ QFile f(fileName); if (!f.open(QFile::ReadOnly)) return QPixmap(); qdesigner_internal::QDesignerFormBuilder formBuilder(workbench()->core(), qdesigner_internal::QDesignerFormBuilder::DisableScripts); QWidget *widget = formBuilder.load(&f, 0); f.close(); if (!widget) return QPixmap(); const int margin = 7; const int shadow = 7; const int previewSize = 256; const QImage image = QPixmap::grabWidget(widget).toImage().scaled(previewSize - margin * 2, previewSize - margin * 2, Qt::KeepAspectRatio, Qt::SmoothTransformation); widget->deleteLater(); QImage dest(previewSize, previewSize, QImage::Format_ARGB32_Premultiplied); dest.fill(0); QPainter p(&dest); p.drawImage(margin, margin, image); p.setPen(QPen(palette().brush(QPalette::WindowText), 0)); p.drawRect(margin-1, margin-1, image.width() + 1, image.height() + 1); const QColor dark(Qt::darkGray); const QColor light(Qt::transparent); // right shadow { const QRect rect(margin + image.width() + 1, margin + shadow, shadow, image.height() - shadow + 1); QLinearGradient lg(rect.topLeft(), rect.topRight()); lg.setColorAt(0, dark); lg.setColorAt(1, light); p.fillRect(rect, lg); } // bottom shadow { const QRect rect(margin + shadow, margin + image.height() + 1, image.width() - shadow + 1, shadow); QLinearGradient lg(rect.topLeft(), rect.bottomLeft()); lg.setColorAt(0, dark); lg.setColorAt(1, light); p.fillRect(rect, lg); } // bottom/right corner shadow { const QRect rect(margin + image.width() + 1, margin + image.height() + 1, shadow, shadow); QRadialGradient g(rect.topLeft(), shadow); g.setColorAt(0, dark); g.setColorAt(1, light); p.fillRect(rect, g); } // top/right corner { const QRect rect(margin + image.width() + 1, margin, shadow, shadow); QRadialGradient g(rect.bottomLeft(), shadow); g.setColorAt(0, dark); g.setColorAt(1, light); p.fillRect(rect, g); } // bottom/left corner { const QRect rect(margin, margin + image.height() + 1, shadow, shadow); QRadialGradient g(rect.topRight(), shadow); g.setColorAt(0, dark); g.setColorAt(1, light); p.fillRect(rect, g); } p.end(); return QPixmap::fromImage(dest);}void NewForm::loadFrom(const QString &path, bool resourceFile, const QString &uiExtension){ const QDir dir(path); if (!dir.exists()) return; // Iterate through the directory and add the templates const QFileInfoList list = dir.entryInfoList(QStringList(QLatin1String("*.") + uiExtension), QDir::Files); if (list.isEmpty()) return; const QChar separator = resourceFile ? QChar(QLatin1Char('/')) : QDir::separator(); QTreeWidgetItem *root = new QTreeWidgetItem(ui.treeWidget); // Try to get something that is easy to read. QString visiblePath = path; int index = visiblePath.lastIndexOf(separator); if (index != -1) { // try to find a second slash, just to be a bit better. const int index2 = visiblePath.lastIndexOf(separator, index - 1); if (index2 != -1) index = index2; visiblePath = visiblePath.mid(index + 1); visiblePath = QDir::toNativeSeparators(visiblePath); } const QChar underscore = QLatin1Char('_'); const QChar blank = QLatin1Char(' '); root->setText(0, visiblePath.replace(underscore, blank)); root->setToolTip(0, path); foreach(QFileInfo fi, list) { if (!fi.isFile()) continue; QTreeWidgetItem *item = new QTreeWidgetItem(root); item->setText(0, fi.baseName().replace(underscore, blank)); item->setData(0, TemplateNameRole, fi.absoluteFilePath()); QTreeWidgetItem *i = ui.treeWidget->currentItem(); if (i == 0) { ui.treeWidget->setCurrentItem(item); ui.treeWidget->setItemSelected(item, true); } } ui.treeWidget->setItemExpanded(root, true);}void NewForm::on_treeWidget_itemPressed(QTreeWidgetItem *item){ if (item && !item->parent()) ui.treeWidget->setItemExpanded(item, !ui.treeWidget->isItemExpanded(item));}bool NewForm::openTemplate(const QString &templateFileName){ QString errorMessage; if (!workbench()->openTemplate(templateFileName, m_fileName, &errorMessage)) { QMessageBox::warning(this, tr("Read error"), errorMessage); return false; } return true;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?