我正在尝试编写自定义委托和自定义模型作为学习Qt的一部分。
我根据QAbstractTableModel
创建了一个简单的自定义模型。我没有做任何复杂的事情。它只在其构造函数中生成数据,并最低限度地实现纯虚函数。
我制作了一个自定义委托,以条形显示数字数据。我还实现了一个旋转框作为编辑器来编辑数据。
该计划运作良好。我可以通过QTableView
查看,编辑和修改数据,并设置委托。
但是有一个小问题。当我调用编辑器时,数据栏仍然存在,这意味着我在后台看到数据栏,顶部有旋转框。
最初,我认为这是因为Qt::EditRole
中的QAbstractTableModel::data()
未正确设置。但令人惊讶的是,我发现Qt::EditRole
从未被调用过。
所以,有两个问题:
当我使用旋转框编辑器时如何删除数据栏?
为什么我的自定义模型中从未调用EditRole
?
以下是我的代码的一部分:
我的自定义模型:
MyModel::MyModel(QObject* parent):QAbstractTableModel(parent)
{
for (int i = 0; i < 10; ++i)
localData.push_back(i*i);
}
QVariant MyModel::data(const QModelIndex &index, int role) const
{
switch(role)
{
case Qt::EditRole:
qDebug() << "EditRole"; //Never Print Out
return 0;
case Qt::DisplayRole :
if (index.column() == 0)
return (index.row());
if (index.column() == 1)
return (localData.at(index.row()));
default:
return QVariant();
}
}
我的自定义代表:
void MyDelegate::paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const
{
painter->save();
painter->setPen(Qt::red);
painter->setBrush(Qt::red);
double factor = 0;
if (index.data().toDouble() > 100)
factor = 1;
else
factor = index.data().toDouble() / (double) (100.0);
painter->drawRect(option.rect.x()+5, option.rect.y()+3, (option.rect.width()-10)*factor, option.rect.height()-6);
painter->restore();
}
QWidget* MyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSpinBox* box = new QSpinBox(parent);
box->setMinimum(0);
box->setMaximum(100);
return box;
}
答案 0 :(得分:2)
未调用Editrole,因为您的自定义编辑器不会查询该数据的模型。您没有为您的旋转框设置任何值。尝试将其设置为:
modeButton.transform = CGAffineTransformMakeTranslation(10, 0)
在MyDelegate :: createEditor()函数中。