如何将QPushButton插入TableView?

时间:2010-05-04 15:57:10

标签: qt qt4 qabstracttablemodel

我正在实施QAbstractTableModel,我想在每行的最后一列插入QPushButton。当用户单击此按钮时,将显示一个新窗口,其中包含有关此行​​的更多信息。

你知道如何插入按钮吗?我知道委派系统,但所有的例子都只是关于“如何使用组合框编辑颜色”......

3 个答案:

答案 0 :(得分:5)

您可以使用

QPushButton* viewButton = new QPushButton("View");    
tableView->setIndexWidget(model->index(counter,2), viewButton);

答案 1 :(得分:3)

模型 - 视图架构不是为了将小部件插入不同的单元格,而是可以在单元格中绘制按钮。

区别在于:

  1. 它只是一个按钮的图纸
  2. 如果没有额外的工作(可能需要额外的工作),鼠标悬停时按钮不会突出显示
  3. 由于上述#1,您无法使用信号和插槽
  4. 那说,这是怎么做的:

    子类QAbstractItemDelegate(或QStyledItemDelegate)并实施paint()方法。要绘制按钮控件(或任何其他控件),您需要使用样式或QStylePainter::drawControl()方法:

    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 */);
        }
    }
    

    由于委托让您进入模型视图领域,因此请使用有关选择和编辑的视图信号来弹出信息窗口。

答案 2 :(得分:0)

您可以使用setCellWidget(row,column,QWidget*)在特定单元格中设置小部件。