自定义委托Paint在编辑时保持不变

时间:2015-11-07 09:54:26

标签: c++ qt model delegates

我正在尝试编写自定义委托和自定义模型作为学习Qt的一部分。

我根据QAbstractTableModel创建了一个简单的自定义模型。我没有做任何复杂的事情。它只在其构造函数中生成数据,并最低限度地实现纯虚函数。

我制作了一个自定义委托,以条形显示数字数据。我还实现了一个旋转框作为编辑器来编辑数据。

该计划运作良好。我可以通过QTableView查看,编辑和修改数据,并设置委托。

但是有一个小问题。当我调用编辑器时,数据栏仍然存在,这意味着我在后台看到数据栏,顶部有旋转框。

最初,我认为这是因为Qt::EditRole中的QAbstractTableModel::data()未正确设置。但令人惊讶的是,我发现Qt::EditRole从未被调用过。

所以,有两个问题:

  1. 当我使用旋转框编辑器时如何删除数据栏?

  2. 为什么我的自定义模型中从未调用EditRole

  3. 以下是我的代码的一部分:

    我的自定义模型:

    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;
    }
    

1 个答案:

答案 0 :(得分:2)

  1. 尝试为您的视图设置setAutoFillBackground(true)
  2. 未调用Editrole,因为您的自定义编辑器不会查询该数据的模型。您没有为您的旋转框设置任何值。尝试将其设置为:

    modeButton.transform = CGAffineTransformMakeTranslation(10, 0)
    
  3. 在MyDelegate :: createEditor()函数中。