我正在实现QAbstractTableModel,我想在每行的最后一列插入QPushButton。当用户点击此按钮时,会显示一个新窗口,其中包含有关该行的更多信息。如何将QPushButton插入到TableView中?
你有什么想法如何插入按钮?我知道委托系统,但所有的例子只是关于“如何用组合框编辑颜色”...
我正在实现QAbstractTableModel,我想在每行的最后一列插入QPushButton。当用户点击此按钮时,会显示一个新窗口,其中包含有关该行的更多信息。如何将QPushButton插入到TableView中?
你有什么想法如何插入按钮?我知道委托系统,但所有的例子只是关于“如何用组合框编辑颜色”...
模型视图体系结构不是为了将小部件插入到不同的单元格中,而是可以绘制推单元格内的按钮。
的区别是:
这就是说,这里是如何做到这一点:
子类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信号关于选择和编辑以弹出您的信息窗口。
您可以使用setCellWidget(row,column,QWidget*)
在特定单元格中设置小部件。
这似乎是QTableWidget而不是QTableView的一种方法。 – Swoogan 2012-10-18 03:41:33
您可以使用
QPushButton* viewButton = new QPushButton("View");
tableView->setIndexWidget(model->index(counter,2), viewButton);
投票这件事,但想补充:你可以让按钮实际上是一个按钮,而不是一个按钮的绘图,但它可能是不值得的,因为开销。您必须创建一个自定义编辑器,并让该单元格在鼠标悬停时进入编辑模式。 – 2010-05-04 21:05:36
有趣的想法。这可能是可能的,但我不确定我将如何执行该操作。 'setEditorData()'调用发生在'QAbstractItemView'的内部,所以它看起来像是很多工作,假设它是可能的。在相关说明中,挂钩悬停并重新绘制以显示可见提示实际上相当容易。 – 2010-05-04 22:53:56
如果您想绘制一个小部件而不是仅仅是一个按钮,代码中的内容会发生什么变化?那个'QStyle :: CE_PushButton'是做什么的? – 2017-06-03 08:26:35