【发布时间】:2010-05-04 15:57:09
【问题描述】:
我正在实现QAbstractTableModel,我想在每行的最后一列插入一个QPushButton。当用户单击此按钮时,将显示一个新窗口,其中包含有关此行的更多信息。
您知道如何插入按钮吗?我知道委派系统,但所有示例都只是关于“如何使用组合框编辑颜色”...
【问题讨论】:
标签: qt qt4 qabstracttablemodel
我正在实现QAbstractTableModel,我想在每行的最后一列插入一个QPushButton。当用户单击此按钮时,将显示一个新窗口,其中包含有关此行的更多信息。
您知道如何插入按钮吗?我知道委派系统,但所有示例都只是关于“如何使用组合框编辑颜色”...
【问题讨论】:
标签: qt qt4 qabstracttablemodel
你可以使用
QPushButton* viewButton = new QPushButton("View");
tableView->setIndexWidget(model->index(counter,2), viewButton);
【讨论】:
模型-视图架构不是为了将小部件插入不同的单元格,但您可以在单元格内绘制按钮。
区别在于:
也就是说,这是怎么做的:
子类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 */);
}
}
由于委托使您处于模型视图领域,因此请使用有关选择和编辑的视图信号来弹出您的信息窗口。
【讨论】:
setEditorData() 调用发生在 QAbstractItemView 的内部,所以看起来这将是很多工作,假设它是可能的。在相关的说明中,实际上很容易挂钩悬停并重新绘制以显示可见的提示。
QStyle::CE_PushButton 是做什么的?
您可以使用setCellWidget(row,column,QWidget*) 在特定单元格中设置小部件。
【讨论】: