Best method for attaching QWidget into a Qtable()

  • Hi everyone,

    This is my first time posting here. I have been coding in Qt for a few years now, but have only recently gone a bit deeper into the Model/View/Customising Widgets.

    Im currently stuck on a problem, and was wondering if anyone could help. I have looked around but have been unable to find something that helps with regards to this problem.

    I have a QAbstractTable that gets populates about 100+ entries, To edit this table I have a QStylisedItemDelegate, that on specific cells creates a drop down with a list of users from the DB. All of this works great, I have color cells depending on which department, or heading is in a specific cell.

    Now here comes the curve ball.

    In 5 of my columns I want to populate the cell with a widget that I have writen, only when in view mode, not in edit mode, as I still want my drop-downs when editing. The widget is nothing to advanced, It draws a block for every stage under the column and gives the status of a stage a color. If the user moves over the color the tooltip gives more information about the stage.

    ! Table and the Widget)!

    Is there a way to populate the cells with my widget, should I instead of creating instances of the my custom widget, use the Delegate.paint() function and recreate the widget inside my delegate(to me this seems a bit messy, but if it has to be done it shall) or should I look into creating a custom view. Im still new to views as so all suggestions are welcome :)

    Thank for the help everyone

  • Qt Champions 2017

    You need to implement the paint() method of delegate when you are in read only mode to display your customwidget.

  • How does one display the widget in paint(), as paint I have found only allows you to paint something new, not create a widget and input it into a cell.

    Am I missing something, or a special way of creating a widget, pulling out its paint and putting it into my delegates paint?

  • Qt Champions 2017

    Yes, It is painting something new. Not for the putting your existing widget. You can copy-paste the widget code as you said.

  • Thanks Dheerendra, I was wondering if by any chance you have a simplecode snippet of something like this as im still struggling to find the correct method of doing this.

  • Qt Champions 2017

    Here is snippet.

    have following enums defined for 5 columns.
    enum Column {Name, Father,Family,Adhar_No,State};

    So paint is called for Adhar_no column

    Tableview settings :
    Delegate Paint implementation.
    void QMyDeligate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const{
    qDebug() << "****I am here *****"<<endl;
    if (index.column() == Adhar_No){
    qDebug() << "Create Hell" << endl;
    if (option.state & QStyle::State_Selected)
    painter->fillRect(option.rect, option.palette.highlight());
    else if (option.state & QStyle::State_MouseOver)
    painter->fillRect(option.rect, option.palette.midlight());
    QFontMetrics fm(option.font);

        QRect outline = option.rect;
        int outmid =;
        QRect fnBound = fm.boundingRect("filename");
        int fnBoundMid =;
        fnBound.translate(0, outmid - fnBoundMid);
        //painter->drawText(fnBound, Qt::AlignVCenter | Qt::AlignLeft, "filename");


  • do you know of a way to only paint every cell on startup and then only selected cells after startup. as currently all 500cells are getting repainted ever time I select anything, and it has created a massive slow down.

  • Thanks, I finally figured it all out and its working :D hooraa!

Log in to reply