How to insert QPushButton into TableView?

后端 未结 3 656
-上瘾入骨i
-上瘾入骨i 2021-01-13 16:54

I am implementing QAbstractTableModel and I would like to insert a QPushButton in the last column of each row. When users click on this button, a n

3条回答
  •  被撕碎了的回忆
    2021-01-13 17:22

    The model-view architecture isn't made to insert widgets into different cells, but you can draw the push button within the cell.

    The differences are:

    1. It will only be a drawing of a pushbutton
    2. Without extra work (perhaps quite a bit of extra work) the button won't be highlighted on mouseover
    3. In consequence of #1 above, you can't use signals and slots

    That said, here's how to do it:

    Subclass QAbstractItemDelegate (or QStyledItemDelegate) and implement the paint() method. To draw the pushbutton control (or any other control for that matter) you'll need to use a style or the QStylePainter::drawControl() method:

    class PushButtonDelegate : public QAbstractItemDelegate
    {
        // TODO: handle public, private, etc.
        QAbstractItemView *view;
    
        public PushButtonDelegate(QAbstractItemView* view)
        {
            this->view = view;
        }
    
        void PushButtonDelegate::paint(
            QPainter* painter,
            const QStyleOptionViewItem & option,
            const QModelIndex & index
            ) const 
        {
            // assuming this delegate is only registered for the correct column/row
            QStylePainter stylePainter(view);
            // OR: stylePainter(painter->device)
    
            stylePainter->drawControl(QStyle::CE_PushButton, option);
            // OR: view->style()->drawControl(QStyle::CE_PushButton, option, painter, view);
            // OR: QApplication::style()->drawControl(/* params as above */);
        }
    }
    

    Since the delegate keeps you within the model-view realm, use the views signals about selection and edits to popup your information window.

提交回复
热议问题