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
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.