0
点赞
收藏
分享

微信扫一扫

Qt 自定义代理类

惠特曼 2024-05-28 阅读 16

一.使用步骤

二.具体实现 

1.继承QStyledItemDelegate类

class CurrencyDelegate : public QStyledItemDelegate
{
public:
    CurrencyDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent)
    {
    }
};

问题1:CurrencyDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent)参入如何传递

2.对代理类进行实现

//创建代理编辑器
QWidget *createEditor(QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override;

// 从数据模型获取数据,显示到代理组件中
void setEditorData(QWidget *editor, const QModelIndex &index) const
override;

//把代理组件的数据,保存到数据模型中
void setModelData(QWidget *editor,
QAbstractItemModel *model,
const QModelIndex &index) const override;

//更新代理编辑组件的大小
void updateEditorGeometry(QWidget *editor,
const QStyleOptionViewItem &option,
const QModelIndex &index) const override;

示例如下:

/创建代理组件的时候,调用这个虚函数
QWidget *QIntSalaryDelagate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    //不使用参数
    Q_UNUSED(option);
    Q_UNUSED(index);



    QSpinBox*editor=new QSpinBox(parent);

    editor->setFrame(false);//无边框
    editor->setMinimum(2000);
    editor->setMaximum(100000);
    editor->setSingleStep(100);

    return editor;
}

void QIntSalaryDelagate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
   int value = index.model()->data(index).toInt();//数据模型中的数据

   QSpinBox*spinBox=static_cast<QSpinBox*>(editor);//这是上面创建的东西

   spinBox->setValue(value);


}

void QIntSalaryDelagate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{

     QSpinBox*spinBox=static_cast<QSpinBox*>(editor);//这是上面创建的东西

     spinBox->interpretText();//解释数据

     int value=spinBox->value();//获取编辑代理的值

     model->setData(index,value);

}

void QIntSalaryDelagate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    editor->setGeometry(option.rect);//就原来的位置
}

 代码解读:

int value = index.model()->data(index).toInt();

问题: 代理就是对模型的数据进行二次加工,然后以另外一种方式放回到模型中吗

三. static_cast<>介绍

QSpinBox* spinBox = static_cast<QSpinBox*>(editor);

 示例分析:

#include <iostream>

class Base {
public:
    virtual void display() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : public Base {
public:
    void display() override {
        std::cout << "Derived class" << std::endl;
    }
};

int main() {
    Base baseObj;
    Derived derivedObj;

    Base* basePtr = &derivedObj;
    Derived* derivedPtr = static_cast<Derived*>(basePtr);

    derivedPtr->display(); // Output: "Derived class"

    return 0;
}

问题1:int value = index.model()->data(index).toInt();

问题2:代理类每次只修改一次索引数据吗? 

问题3:QcomboBox代理时的过程分析 

QWidget *JobDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    QComboBox*editor=new QComboBox(parent);

    //设置属性
    QStringList list={"软件工程师","经理","程序员","助理"};
    editor->addItems(list);
    return editor;
}

void JobDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    
    Q_UNUSED(index);
    //设置编辑器数据
    QComboBox*combox=static_cast<QComboBox*>(editor);

    combox->setCurrentText(index.model()->data(index).toString());
}

void JobDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    //设置模型的数据

     QComboBox*combox=static_cast<QComboBox*>(editor);

     QString str=combox->currentText();


     model->setData(index,str);


}
举报

相关推荐

0 条评论