📄 propertyeditor.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 "propertyeditor.h"#include "findicondialog_p.h"#include "qpropertyeditor_model_p.h"#include "qpropertyeditor_items_p.h"// sdk#include <QtDesigner/QtDesigner>#include <QtDesigner/QExtensionManager>// shared#include <iconloader_p.h>#include <qdesigner_promotedwidget_p.h>#include <qdesigner_utils_p.h>#include <metadatabase_p.h>#include <QtGui/QtGui>#ifndef Q_MOC_RUNusing namespace qdesigner_internal;#endifIProperty *PropertyEditor::createSpecialProperty(const QVariant &value, const QString &name){ Q_UNUSED(value); Q_UNUSED(name); return 0;}// ---------------------------------------------------------------------------------class IconProperty : public AbstractProperty<QIcon>{public: IconProperty(QDesignerFormEditorInterface *core, const QIcon &value, const QString &name); void setValue(const QVariant &value); QString toString() const; QVariant decoration() const; QWidget *createEditor(QWidget *parent, const QObject *target, const char *receiver) const; void updateEditorContents(QWidget *editor); void updateValue(QWidget *editor);private: QDesignerFormEditorInterface *m_core;};class PixmapProperty : public AbstractProperty<QPixmap>{public: PixmapProperty(QDesignerFormEditorInterface *core, const QPixmap &pixmap, const QString &name); void setValue(const QVariant &value); QString toString() const; QVariant decoration() const; QWidget *createEditor(QWidget *parent, const QObject *target, const char *receiver) const; void updateEditorContents(QWidget *editor); void updateValue(QWidget *editor);private: QDesignerFormEditorInterface *m_core;};// This handles editing of pixmap and icon propertiesclass GraphicsPropertyEditor : public QWidget{ Q_OBJECTpublic: GraphicsPropertyEditor(QDesignerFormEditorInterface *core, const QIcon &pm, QWidget *parent); GraphicsPropertyEditor(QDesignerFormEditorInterface *core, const QPixmap &pixmap, QWidget *parent); ~GraphicsPropertyEditor(); void setIcon(const QIcon &pm); void setPixmap(const QPixmap &pm); QIcon icon() const { return m_mode == Icon ? m_icon : QIcon(); } QPixmap pixmap() const { return m_mode == Pixmap ? m_pixmap : QPixmap(); }signals: void iconChanged(const QIcon &pm); void pixmapChanged(const QPixmap &pm);private slots: void showDialog(); void comboActivated(int idx);private: void init(); void populateCombo(); int indexOfIcon(const QIcon &icon); int indexOfPixmap(const QPixmap &pixmap); enum Mode { Icon, Pixmap }; Mode m_mode; QDesignerFormEditorInterface *m_core; QComboBox *m_combo; QToolButton *m_button; QIcon m_icon; QPixmap m_pixmap;};GraphicsPropertyEditor::~GraphicsPropertyEditor(){}void GraphicsPropertyEditor::init(){ QHBoxLayout *layout = new QHBoxLayout(this); layout->setMargin(0); layout->setSpacing(0); m_combo = new QComboBox(this); m_combo->setFrame(0); m_combo->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); m_combo->setEditable(false); layout->addWidget(m_combo); m_button = new QToolButton(this); m_button->setIcon(createIconSet(QLatin1String("fileopen.png"))); m_button->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::MinimumExpanding); m_button->setFixedWidth(20); layout->addWidget(m_button); connect(m_button, SIGNAL(clicked()), this, SLOT(showDialog())); connect(m_combo, SIGNAL(activated(int)), this, SLOT(comboActivated(int))); populateCombo();}void GraphicsPropertyEditor::comboActivated(int idx){ if (m_mode == Icon) { setIcon(qvariant_cast<QIcon>(m_combo->itemData(idx))); } else { setPixmap(qvariant_cast<QPixmap>(m_combo->itemData(idx))); }}int GraphicsPropertyEditor::indexOfIcon(const QIcon &icon){ if (m_mode == Pixmap) return -1; if (icon.isNull()) return 0; for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QIcon>(m_combo->itemData(i)).serialNumber() == icon.serialNumber()) return i; } populateCombo(); for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QIcon>(m_combo->itemData(i)).serialNumber() == icon.serialNumber()) return i; } return -1;}int GraphicsPropertyEditor::indexOfPixmap(const QPixmap &pixmap){ if (m_mode == Icon) return -1; if (pixmap.isNull()) return 0; for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QPixmap>(m_combo->itemData(i)).serialNumber() == pixmap.serialNumber()) return i; } populateCombo(); for (int i = 1; i < m_combo->count(); ++i) { if (qvariant_cast<QPixmap>(m_combo->itemData(i)).serialNumber() == pixmap.serialNumber()) return i; } return -1;}void GraphicsPropertyEditor::populateCombo(){ QDesignerFormWindowInterface *form = m_core->formWindowManager()->activeFormWindow(); if (form == 0) return; QStringList qrc_list = form->resourceFiles(); m_combo->clear(); QDesignerIconCacheInterface *cache = m_core->iconCache(); if (m_mode == Icon) { m_combo->addItem(tr("<no icon>")); QList<QIcon> icon_list = cache->iconList(); foreach (QIcon icon, icon_list) { QString qrc_path = cache->iconToQrcPath(icon); if (!qrc_path.isEmpty() && !qrc_list.contains(qrc_path)) continue; m_combo->addItem(icon, QFileInfo(cache->iconToFilePath(icon)).fileName(), QVariant(icon)); } } else { m_combo->addItem(tr("<no pixmap>")); QList<QPixmap> pixmap_list = cache->pixmapList(); foreach (QPixmap pixmap, pixmap_list) { QString qrc_path = cache->iconToQrcPath(pixmap); if (!qrc_path.isEmpty() && !qrc_list.contains(qrc_path)) continue; m_combo->addItem(QIcon(pixmap), QFileInfo(cache->pixmapToFilePath(pixmap)).fileName(), QVariant(pixmap)); } } bool blocked = m_combo->blockSignals(true); m_combo->setCurrentIndex(0); m_combo->blockSignals(blocked);}GraphicsPropertyEditor::GraphicsPropertyEditor(QDesignerFormEditorInterface *core, const QIcon &pm, QWidget *parent) : QWidget(parent){ m_mode = Icon; m_core = core; init(); setIcon(pm);}GraphicsPropertyEditor::GraphicsPropertyEditor(QDesignerFormEditorInterface *core, const QPixmap &pm, QWidget *parent) : QWidget(parent){ m_mode = Pixmap; m_core = core; init(); setPixmap(pm);}void GraphicsPropertyEditor::showDialog(){ QDesignerFormWindowInterface *form = m_core->formWindowManager()->activeFormWindow(); if (form == 0) return; QString file_path; QString qrc_path; if (m_mode == Icon && !m_icon.isNull()) { file_path = m_core->iconCache()->iconToFilePath(m_icon); qrc_path = m_core->iconCache()->iconToQrcPath(m_icon); } else if (!m_pixmap.isNull()) { file_path = m_core->iconCache()->pixmapToFilePath(m_pixmap); qrc_path = m_core->iconCache()->pixmapToQrcPath(m_pixmap); } FindIconDialog dialog(form, 0); dialog.setPaths(qrc_path, file_path); if (dialog.exec()) { file_path = dialog.filePath(); qrc_path = dialog.qrcPath(); if (!file_path.isEmpty()) { populateCombo(); if (m_mode == Icon) { QIcon icon = m_core->iconCache()->nameToIcon(file_path, qrc_path); populateCombo(); setIcon(icon); } else { QPixmap pixmap = m_core->iconCache()->nameToPixmap(file_path, qrc_path); populateCombo(); setPixmap(pixmap); } } }}void GraphicsPropertyEditor::setIcon(const QIcon &pm){ if (m_mode == Pixmap) return; if (pm.isNull() && m_icon.isNull()) return; if (pm.serialNumber() == m_icon.serialNumber()) return; m_icon = pm; bool blocked = m_combo->blockSignals(true); m_combo->setCurrentIndex(indexOfIcon(m_icon)); m_combo->blockSignals(blocked); emit iconChanged(m_icon);}void GraphicsPropertyEditor::setPixmap(const QPixmap &pm){ if (m_mode == Icon) return; if (pm.isNull() && m_pixmap.isNull()) return; if (pm.serialNumber() == m_pixmap.serialNumber()) return; m_pixmap = pm; bool blocked = m_combo->blockSignals(true); m_combo->setCurrentIndex(indexOfPixmap(m_pixmap)); m_combo->blockSignals(blocked); emit pixmapChanged(m_pixmap);}IconProperty::IconProperty(QDesignerFormEditorInterface *core, const QIcon &value, const QString &name) : AbstractProperty<QIcon>(value, name){ m_core = core;}void IconProperty::setValue(const QVariant &value){ m_value = qvariant_cast<QIcon>(value);}QString IconProperty::toString() const{ QString path = m_core->iconCache()->iconToFilePath(m_value); return QFileInfo(path).fileName();}QVariant IconProperty::decoration() const{ static QIcon empty_icon; if (empty_icon.isNull()) empty_icon = QIcon(QLatin1String(":/trolltech/formeditor/images/emptyicon.png")); if (m_value.isNull()) return qVariantFromValue(empty_icon); return qVariantFromValue(m_value);}QWidget *IconProperty::createEditor(QWidget *parent, const QObject *target, const char *receiver) const{ GraphicsPropertyEditor *editor = new GraphicsPropertyEditor(m_core, m_value, parent); QObject::connect(editor, SIGNAL(iconChanged(QIcon)), target, receiver); return editor;}void IconProperty::updateEditorContents(QWidget *editor){ if (GraphicsPropertyEditor *ed = qobject_cast<GraphicsPropertyEditor*>(editor)) { ed->setIcon(m_value); }}void IconProperty::updateValue(QWidget *editor){ if (GraphicsPropertyEditor *ed = qobject_cast<GraphicsPropertyEditor*>(editor)) { QIcon newValue = ed->icon(); if (newValue.serialNumber() != m_value.serialNumber()) { m_value = newValue; setChanged(true); } }}PixmapProperty::PixmapProperty(QDesignerFormEditorInterface *core, const QPixmap &pixmap, const QString &name)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -