• 5342阅读
  • 5回复

[建议]哪位大神能给解释一下setCellWidget(int,int,qwidget*)这个接口的实现原理 [复制链接]

上一主题 下一主题
离线菜鸟一个
 

只看楼主 倒序阅读 楼主  发表于: 2019-02-21
回复本帖可获得5RMB金钱奖励!
每人最多可获奖1次,奖池剩余10RMB金钱 (中奖几率40%)
想写一个类似于qtabelwidget的setCellWidget()的接口,可以在第三个参数传自己想用的控件,如checkbox,combobox等控件指针,比如我传一个checkbox*进去,传进去之后不是会向上转化成父类了吗,假如在不基于模型的情况下,怎么样知道我传的是checkbox*呢,哪位大神能给点意见

离线liudianwu

只看该作者 1楼 发表于: 2019-02-21
回帖奖励+ 5
自己if判断下实例化不就行了。
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线菜鸟一个

只看该作者 2楼 发表于: 2019-02-21
回 liudianwu 的帖子
liudianwu:自己if判断下实例化不就行了。
[图片] (2019-02-21 11:11) 

在没有模型的情况下,不知道委托类型,怎么确定是哪个控件呢
离线automoblie0

只看该作者 3楼 发表于: 2019-02-21
回 liudianwu 的帖子
回帖奖励+ 5
liudianwu:自己if判断下实例化不就行了。
[图片] (2019-02-21 11:11) 

delegateType?
离线yysr

只看该作者 4楼 发表于: 2019-02-21
// *************************************************************************************************
//
// QPropertyEditor v 0.3
//  
// --------------------------------------
// Copyright (C) 2007 Volker Wiendl
// Acknowledgements to Roman alias banal from qt-apps.org for the Enum enhancement
//
//
// The QPropertyEditor Library is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation version 3 of the License
//
// The Horde3D Scene Editor is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// *************************************************************************************************
#ifndef COLORSELECTIONBUTTON_H_
#define COLORSELECTIONBUTTON_H_

#include <QtGui/QItemDelegate>

class QSignalMapper;

/**
* This class is used to create the editor widgets for datatypes encapsulated in QVariant variables
*/
class QVariantDelegate : public QItemDelegate
{
    Q_OBJECT

public:
    /**
     * Constructor
     * @param parent optional parent object
     */
    QVariantDelegate(QObject* parent = 0);
    /// Destructor
    virtual ~QVariantDelegate();

    /**
     * Creates an editor widget as child of a given widget for a specific QModelIndex
     *
     * @param parent the parent widget for the editor
     * @param option some style options that the editor should use
     * @param index the index of the item the editor will be created for
     * @return   QWidget the editor widget
     */
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;

    /**
     * Tries to set the editor data based on the value stored at a specific QModelIndex
     * @param editor the editor widget
     * @param index the model index of the value that should be used in the editor
     */
    virtual void setEditorData(QWidget *editor, const QModelIndex &index) const;

    /**
     * Sets the data of a specific QModelIndex to tha value of the editor widget
     * @param editor the editor widget that contains the new value
     * @param model the model that contains the index
     * @param index the index within the model whose data value should be set to the data value of the editor
     */
    virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;

    /// QItemDelegate implementation
    virtual void updateEditorGeometry(QWidget *editor,  const QStyleOptionViewItem &option, const QModelIndex &index) const;

private:
    void parseEditorHints(QWidget* editor, const QString& editorHints) const;

    QSignalMapper*    m_finishedMapper;
};
#endif






// *************************************************************************************************
//
// QPropertyEditor v 0.3
//  
// --------------------------------------
// Copyright (C) 2007 Volker Wiendl
// Acknowledgements to Roman alias banal from qt-apps.org for the Enum enhancement
//
//
// The QPropertyEditor Library is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation version 3 of the License
//
// The Horde3D Scene Editor is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// *************************************************************************************************

#include "QVariantDelegate.h"

#include "Property.h"

#include <QtGui/QAbstractItemView>
#include <QtCore/QSignalMapper>


QVariantDelegate::QVariantDelegate(QObject* parent) : QItemDelegate(parent)
{
    m_finishedMapper = new QSignalMapper(this);
    connect(m_finishedMapper, SIGNAL(mapped(QWidget*)), this, SIGNAL(commitData(QWidget*)));
    connect(m_finishedMapper, SIGNAL(mapped(QWidget*)), this, SIGNAL(closeEditor(QWidget*)));
}


QVariantDelegate::~QVariantDelegate()
{
}

QWidget *QVariantDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem& option , const QModelIndex & index ) const
{
    QWidget* editor = 0;
    Property* p = static_cast<Property*>(index.internalPointer());
    switch(p->value().type())
    {
    case QVariant::Color:
    case QVariant::Int:
    case QMetaType::Float:    
    case QVariant::Double:    
    case QVariant::UserType:            
        editor = p->createEditor(parent, option);
        if (editor)    
        {
            if (editor->metaObject()->indexOfSignal("editFinished()") != -1)
            {
                connect(editor, SIGNAL(editFinished()), m_finishedMapper, SLOT(map()));
                m_finishedMapper->setMapping(editor, editor);
            }
            break; // if no editor could be created take default case
        }
    default:
        editor = QItemDelegate::createEditor(parent, option, index);
    }
    parseEditorHints(editor, p->editorHints());
    return editor;
}

void QVariantDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{        
    m_finishedMapper->blockSignals(true);
    QVariant data = index.model()->data(index, Qt::EditRole);    
    
    switch(data.type())
    {
    case QVariant::Color:                
    case QMetaType::Double:
    case QMetaType::Float:
    case QVariant::UserType:
    case QVariant::Int:
        if (static_cast<Property*>(index.internalPointer())->setEditorData(editor, data)) // if editor couldn't be recognized use default
            break;
    default:
        QItemDelegate::setEditorData(editor, index);
        break;
    }
    m_finishedMapper->blockSignals(false);
}

void QVariantDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{    
    QVariant data = index.model()->data(index, Qt::EditRole);    
    switch(data.type())
    {
    case QVariant::Color:        
    case QMetaType::Double:
    case QMetaType::Float:                
    case QVariant::UserType:
    case QVariant::Int:
        {
            QVariant data = static_cast<Property*>(index.internalPointer())->editorData(editor);
            if (data.isValid())
            {
                model->setData(index, data , Qt::EditRole);
                break;
            }
        }
    default:
        QItemDelegate::setModelData(editor, model, index);
        break;
    }
}

void QVariantDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex& index ) const
{
    return QItemDelegate::updateEditorGeometry(editor, option, index);
}

void QVariantDelegate::parseEditorHints(QWidget* editor, const QString& editorHints) const
{
    if (editor && !editorHints.isEmpty())
    {
        editor->blockSignals(true);
        // Parse for property values
        QRegExp rx("(.*)(=\\s*)(.*)(;{1})");
        rx.setMinimal(true);
        int pos = 0;
        while ((pos = rx.indexIn(editorHints, pos)) != -1)
        {
            //qDebug("Setting %s to %s", qPrintable(rx.cap(1)), qPrintable(rx.cap(3)));
            editor->setProperty(qPrintable(rx.cap(1).trimmed()), rx.cap(3).trimmed());                
            pos += rx.matchedLength();
        }
        editor->blockSignals(false);
    }
}
本帖提到的人: @return
离线沉默小ai

只看该作者 5楼 发表于: 2019-04-30
回 菜鸟一个 的帖子
回帖奖励+ 5
菜鸟一个:在没有模型的情况下,不知道委托类型,怎么确定是哪个控件呢[表情] (2019-02-21 14:43) 

classname    QObject内的函数
快速回复
限100 字节
 
上一个 下一个