Insert fill circle into cell of QTableWidget



  • @mrjj

    I can not return a cell in the data method of the model because it gives me an error:

    0_1544553267398_Selección_002.png


  • Lifetime Qt Champion

    @juaniyoalm
    you try to return a Cell pointer.
    Should be like
    mundo->getCell(index.row(), index.column())->somePublicVariable
    or
    mundo->getCell(index.row(), index.column())->Func(); // return some data, int , float , etc

    Why you want to return the cell pointer ?
    Just return some of its data



  • @mrjj

    I think I'm not understanding ... hah.

    If I put the following:

    0_1544553931277_Selección_003.png

    When I modify the value in this method:

    0_1544554094879_Selección_004.png

    Or these:

    0_1544554184318_Selección_005.png

    That signals activate this method (slot):

    0_1544554310170_Selección_006.png

    But in no time I pass the role and then the model does not know what data to return...


  • Lifetime Qt Champion

    Hi
    The view itself ask for
    Qt::DisplayRole and Qt::EditRole ( if u edit cell )
    the new roles was for the delegate to request data it needs.

    You did study for more than a few minutes the
    http://doc.qt.io/qt-5/model-view-programming.html
    right ?



  • @mrjj

    Ok, I understand now. The problems are solved:

    QVariant CellModel::data(const QModelIndex &index, int role) const
    {
        if(!index.isValid())
            return QVariant();
    
        if(index.row() >= mundo->getWorld().size() || index.row() < 0 ||
               index.column() >= mundo->getWorld()[0].size() || index.column() < 0)
            return QVariant();
    
        if(role == CircleSize)
        {
            return this->mundo->getCell(index.row(), index.column())->getFungivoresSize();
        }
    
        if(role == FoodCount)
        {
            return this->mundo->getCell(index.row(), index.column())->getFood();
        }
        return QVariant();
    }
    

    And paint method:

    void CellDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
    {
        int cellValue = index.model()->data(index, Qt::UserRole+2).toInt();
        qreal circleValue = index.model()->data(index, Qt::UserRole+1).toInt();
    
        qreal circleRealValue = (circleValue*20)/50;
    
        painter->save();
        painter->fillRect(option.rect, QBrush(QColor((255 - cellValue), 255, 51)));
    
        painter->setBrush(Qt::blue);
        painter->drawEllipse(static_cast<QPointF>(option.rect.center()), circleRealValue, circleRealValue);
        painter->setRenderHint(QPainter::Antialiasing, true);
        painter->setPen(Qt::NoPen);
    
        painter->restore();
    }
    

  • Lifetime Qt Champion

    Hi
    Super.
    Note you should try to reuse the CircleSize, FoodCount constexpr if possible
    instead of Qt::UserRole+1.
    you can just make a .h file and put them there and let both
    model and delegate include it.



  • @mrjj

    Ok I have already done it.

    I want to thank all of you who have tried to help me, especially @mrjj and @SGaist . You have had a lot of patience with me. Thank you.

    Surely I will have more questions about the project later. I'll stay here.


  • Lifetime Qt Champion

    @juaniyoalm
    Well good work then. :)
    Please mark as solved.
    You can always make new posts
    for new problems.

    and happy programming.


Log in to reply