2010-05-04 61 views
4

我正在实现QAbstractTableModel,我想在每行的最后一列插入QPushButton。当用户点击此按钮时,会显示一个新窗口,其中包含有关该行的更多信息。如何将QPushButton插入到TableView中?

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

回答

3

模型视图体系结构不是为了将小部件插入到不同的单元格中,而是可以绘制推单元格内的按钮。

的区别是:

  1. 这只会是一个按钮
  2. 的图纸没有额外的工作(也许相当多的额外工作)按钮将不会在鼠标悬停
  3. 突出在以上#1的结果,你不能使用信号和槽

这就是说,这里是如何做到这一点:

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

由于委托让你的模型 - 视图领域内,将views信号关于选择和编辑以弹出您的信息窗口。

+0

投票这件事,但想补充:你可以让按钮实际上是一个按钮,而不是一个按钮的绘图,但它可能是不值得的,因为开销。您必须创建一个自定义编辑器,并让该单元格在鼠标悬停时进入编辑模式。 – 2010-05-04 21:05:36

+0

有趣的想法。这可能是可能的,但我不确定我将如何执行该操作。 'setEditorData()'调用发生在'QAbstractItemView'的内部,所以它看起来像是很多工作,假设它是可能的。在相关说明中,挂钩悬停并重新绘制以显示可见提示实际上相当容易。 – 2010-05-04 22:53:56

+0

如果您想绘制一个小部件而不是仅仅是一个按钮,代码中的内容会发生什么变化?那个'QStyle :: CE_PushButton'是做什么的? – 2017-06-03 08:26:35

0

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

+1

这似乎是QTableWidget而不是QTableView的一种方法。 – Swoogan 2012-10-18 03:41:33

5

您可以使用

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