qpropertyeditor_model.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 314 行
CPP
314 行
/******************************************************************************** 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 "qpropertyeditor_model_p.h"#include "graphicspropertyeditor.h"#include <resourcemimedata_p.h>#include <qdesigner_utils_p.h>#include <QtDesigner/QDesignerFormEditorInterface>#include <QtDesigner/QDesignerFormWindowManagerInterface>#include <QtDesigner/QDesignerFormWindowInterface>namespace qdesigner_internal {QPropertyEditorModel::QPropertyEditorModel(QObject *parent) : QAbstractItemModel(parent), m_initialInput(0){}QPropertyEditorModel::~QPropertyEditorModel(){}void QPropertyEditorModel::setInitialInput(IProperty *initialInput){ Q_ASSERT(initialInput); m_initialInput = initialInput; reset();}QModelIndex QPropertyEditorModel::index(int row, int column, const QModelIndex &parent) const{ if (!parent.isValid()) return createIndex(row, column, m_initialInput); return createIndex(row, column, childAt(privateData(parent), row));}QModelIndex QPropertyEditorModel::parent(const QModelIndex &index) const{ if (!index.isValid() || privateData(index) == m_initialInput) return QModelIndex(); Q_ASSERT(privateData(index)); return indexOf(parentOf(privateData(index)));}int QPropertyEditorModel::rowCount(const QModelIndex &parent) const{ if (!parent.isValid()) return 1; if (const IProperty *p = privateData(parent)) { return (p->kind() == IProperty::Property_Group) ? static_cast<const IPropertyGroup*>(p)->propertyCount() : 0; } return (m_initialInput->kind() == IProperty::Property_Group) ? static_cast<const IPropertyGroup*>(m_initialInput)->propertyCount() : 0;}int QPropertyEditorModel::columnCount(const QModelIndex &parent) const{ Q_UNUSED(parent); return 2;}bool QPropertyEditorModel::setData(const QModelIndex &index, const QVariant &value, int role){ if (IProperty *property = privateData(index)) { if (role == Qt::EditRole) { property->setValue(value); refresh(property); IProperty *nonfake = property; while (nonfake != 0 && nonfake->isFake()) nonfake = nonfake->parent(); if (nonfake != 0 && nonfake->dirty()) { nonfake->setDirty(false); emit propertyChanged(nonfake); } } return true; } return false;}QVariant QPropertyEditorModel::data(const QModelIndex &index, int role) const{ Q_UNUSED(role); if (!privateData(index)) return QVariant(); static const QString noname = tr("<noname>"); const IProperty *o = privateData(index); switch (index.column()) { // ### cleanup case 0: switch (role) { case Qt::EditRole: case Qt::DisplayRole: case Qt::ToolTipRole: return o->propertyName().isEmpty() ? noname : o->propertyName(); default: break; } break; case 1: { switch (role) { case Qt::EditRole: return o->value(); case Qt::ToolTipRole: case Qt::DisplayRole: return o->toString(); case Qt::DecorationRole: return o->decoration(); default: break; } break; } default: break; } return QVariant();}QString QPropertyEditorModel::columnText(int col) const{ switch (col) { case 0: return tr("Property"); case 1: return tr("Value"); default: return QString(); }}void QPropertyEditorModel::refresh(IProperty *property){ // find parent if it is a fake IProperty *parent = property; while (parent && parent->isFake()) parent = parent->parent(); const int parentRow = rowOf(parent); if (parentRow == -1) return; const QModelIndex parentIndex0 = createIndex(parentRow, 0, parent); const QModelIndex parentIndex1 = createIndex(parentRow, 1, parent); emit dataChanged(parentIndex0, parentIndex1); // refresh children if (parent->kind() == IProperty::Property_Group) { IPropertyGroup* group = static_cast<IPropertyGroup*>(parent); if (const int numRows = group->propertyCount()) { const QModelIndex leftTopChild = parentIndex0.child(0, 0); const QModelIndex rightBottomChild = parentIndex0.child(numRows - 1, 1); emit dataChanged(leftTopChild, rightBottomChild); } }}bool QPropertyEditorModel::isEditable(const QModelIndex &index) const{ return index.column() == 1 && privateData(index)->hasEditor();}QModelIndex QPropertyEditorModel::buddy(const QModelIndex &index) const{ if (index.column() == 0) return createIndex(index.row(), 1, index.internalPointer()); return index;}QVariant QPropertyEditorModel::headerData(int section, Qt::Orientation orientation, int role) const{ if (orientation == Qt::Horizontal) { if (role != Qt::DisplayRole) return QVariant(); return columnText(section); } return QAbstractItemModel::headerData(section, orientation, role);}Qt::ItemFlags QPropertyEditorModel::flags(const QModelIndex &index) const{ Q_ASSERT(index.isValid()); Qt::ItemFlags foo = QAbstractItemModel::flags(index); if (isEditable(index)) foo |= Qt::ItemIsEditable; return foo;}int QPropertyEditorModel::rowOf(IProperty *property) const{ Q_ASSERT(property); if (property == m_initialInput) return 0; IProperty *parent = property->parent(); if (!parent || parent->kind() != IProperty::Property_Group) return -1; return static_cast<const IPropertyGroup*>(parent)->indexOf(property);} static bool setImage(const ResourceMimeData &image, PixmapProperty *property){ QDesignerFormWindowInterface *form = property->core()->formWindowManager()->activeFormWindow(); if (!form) return false; const QPixmap newPixmap = resourceMimeDataToPixmap(image, form); const QPixmap oldPixmap = qvariant_cast<QPixmap>(property->value()); if (newPixmap.isNull() || newPixmap .serialNumber() == oldPixmap.serialNumber()) return false; property->setValue(QVariant(newPixmap)); return true;} static bool setIcon(const ResourceMimeData &image, IconProperty *property){ QDesignerFormWindowInterface *form = property->core()->formWindowManager()->activeFormWindow(); if (!form) return false; const QIcon newIcon = resourceMimeDataToIcon(image, form); const QIcon oldIcon = qvariant_cast<QIcon>(property->value()); if (newIcon.isNull() || newIcon .serialNumber() == oldIcon.serialNumber()) return false; property->setValue(QVariant(newIcon)); return true;} bool QPropertyEditorModel::resourceImageDropped(const QModelIndex &index, const ResourceMimeData &resourceMimeData){ if (!index.isValid() || resourceMimeData.type() != ResourceMimeData::Image) return false; IProperty *property = static_cast<IProperty*>(index.internalPointer()); if (!property || property->isFake()) return false; bool changed = false; switch (property->value().type()) { case QVariant::Icon: changed = setIcon(resourceMimeData, static_cast<IconProperty *>(property)); break; case QVariant::Pixmap: changed = setImage(resourceMimeData, static_cast<PixmapProperty *>(property)); break; default: break; } if (changed) emit propertyChanged(property); return changed;}}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?