Qt:如何在委托绘制事件中渲染时增加 QTablewidget?
Qt: How to grow a QTablewidget when rendering in a delegate paint event?
我很头疼
让我们考虑以下几点:
我有一个带有从 QStyledItemDelegate 派生的自定义委托的 QListView。
在委托的 paint()
事件中,我在表格视图中使用了一个自定义小部件 render()
。这只是一个静态渲染,它很好,因为我只需要显示一些东西而不需要交互。
我的自定义小部件包含一个嵌入垂直布局的 QTableWidget 和我在委托的 sizehint()
中填充数据的其他一些标签。然后我 "force update" 使用此技术自定义小部件的布局:Qt: How to force a hidden widget to calculate its layout? - 请参阅 forceUpdate()
代码。
一切看起来都很好,除了一件事:我的自定义小部件的 tablewidget 似乎在需要时垂直增长(当我在其中添加行时),但行没有呈现!!!虽然缩小是可以的,为自定义小部件设置一个非常大的高度以某种方式解决了问题,但它并不优雅,只是报告问题。
由于它只是呈现,因此不是交互式的,我不想要滚动条,但我需要 QTableWidget 到 shrink/grow 来显示添加的数据。不多也不少
自定义小部件的 GUI 是与设计器一起制作的,所有内容都设置为动态增长和收缩。问题在哪里?有没有人见过这样的行为?如果是的话,神奇的参数组合是什么?
一些眼睛代码:
QSize ResultsRunDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
// updating custom widget's data
item_widget->UpdateDisplay(index.row()+1);
forceUpdate(item_widget); //updating the layout
return item_widget->sizeHint(); }
void ResultsRunDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QPaintDevice* originalPaintDev = painter->device();
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
painter->end();
forceUpdate(item_widget);
item_widget->render(painter->device(), QPoint(option.rect.x(), option.rect.y()), QRegion(0, 0, item_widget->rect().width()/*item_widget->sizeHint().width()*/, /*item_widget->rect().height()*/item_widget->sizeHint().height()), QWidget::DrawChildren);
painter->begin(originalPaintDev);
}
如有任何帮助,我们将不胜感激。提前致谢!
希望题目不错,欢迎评论
不幸的是,QTableView
的 sizeHint()
并不依赖于它的内容。布局计算后,您可以从
得到 table 的理想尺寸
int width = view->verticalHeader()->width() + view->horizontalHeader()->width() + view->frameWidth()*2;
int height= view->horizontalHeader()->height() + view->verticalHeader()->height() + view->frameWidth()*2;
并相应地调整小部件的大小。
我很头疼
让我们考虑以下几点:
我有一个带有从 QStyledItemDelegate 派生的自定义委托的 QListView。
在委托的 paint()
事件中,我在表格视图中使用了一个自定义小部件 render()
。这只是一个静态渲染,它很好,因为我只需要显示一些东西而不需要交互。
我的自定义小部件包含一个嵌入垂直布局的 QTableWidget 和我在委托的 sizehint()
中填充数据的其他一些标签。然后我 "force update" 使用此技术自定义小部件的布局:Qt: How to force a hidden widget to calculate its layout? - 请参阅 forceUpdate()
代码。
一切看起来都很好,除了一件事:我的自定义小部件的 tablewidget 似乎在需要时垂直增长(当我在其中添加行时),但行没有呈现!!!虽然缩小是可以的,为自定义小部件设置一个非常大的高度以某种方式解决了问题,但它并不优雅,只是报告问题。
由于它只是呈现,因此不是交互式的,我不想要滚动条,但我需要 QTableWidget 到 shrink/grow 来显示添加的数据。不多也不少
自定义小部件的 GUI 是与设计器一起制作的,所有内容都设置为动态增长和收缩。问题在哪里?有没有人见过这样的行为?如果是的话,神奇的参数组合是什么?
一些眼睛代码:
QSize ResultsRunDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const {
// updating custom widget's data
item_widget->UpdateDisplay(index.row()+1);
forceUpdate(item_widget); //updating the layout
return item_widget->sizeHint(); }
void ResultsRunDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QPaintDevice* originalPaintDev = painter->device();
if (option.state & QStyle::State_Selected)
painter->fillRect(option.rect, option.palette.highlight());
painter->end();
forceUpdate(item_widget);
item_widget->render(painter->device(), QPoint(option.rect.x(), option.rect.y()), QRegion(0, 0, item_widget->rect().width()/*item_widget->sizeHint().width()*/, /*item_widget->rect().height()*/item_widget->sizeHint().height()), QWidget::DrawChildren);
painter->begin(originalPaintDev);
}
如有任何帮助,我们将不胜感激。提前致谢! 希望题目不错,欢迎评论
QTableView
的 sizeHint()
并不依赖于它的内容。布局计算后,您可以从
int width = view->verticalHeader()->width() + view->horizontalHeader()->width() + view->frameWidth()*2;
int height= view->horizontalHeader()->height() + view->verticalHeader()->height() + view->frameWidth()*2;
并相应地调整小部件的大小。