一.使用步骤
二.具体实现
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);
}