Qt:在委托绘制事件中渲染时如何增加 QTablewidget?

Posted

技术标签:

【中文标题】Qt:在委托绘制事件中渲染时如何增加 QTablewidget?【英文标题】:Qt: How to grow a QTablewidget when rendering in a delegate paint event? 【发布时间】:2016-12-01 10:52:15 【问题描述】:

我很头疼。 让我们考虑以下几点: 我有一个 QListView,它带有一个从 QStyledItemDelegate 派生的自定义委托。 在委托的paint() 事件中,我使用了我在表格视图中render() 的自定义小部件。这只是一个静态渲染,这很好,因为我只需要显示一些东西而不需要交互。 我的自定义小部件包含一个嵌入垂直布局的 QTableWidget 和一些其他标签,我在委托的 sizehint() 中填充了数据。然后,我使用这种技术“强制更新”自定义小部件的布局:Qt: How to force a hidden widget to calculate its layout? - 请参阅forceUpdate() 代码。 一切似乎都很好,除了一件事:我的自定义小部件的 tablewidget 似乎在需要时垂直增长(当我在其中添加行时),但行没有呈现!!!虽然缩小是可以的,为自定义小部件设置一个非常大的高度以某种方式解决了问题,但它并不优雅,只是报告了问题。 由于它只是渲染,因此不是交互式的,我不想要滚动条,但我需要 QTableWidget 缩小/增长以显示添加的数据。不多也不少。 自定义小部件的 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);

任何帮助将不胜感激。提前谢谢! 希望题主好,欢迎cmets。

【问题讨论】:

【参考方案1】:

不幸的是,QTableViewsizeHint() 并不依赖于它的内容。布局计算好后,可以从

得到表格的理想尺寸
int width = view->verticalHeader()->width() + view->horizontalHeader()->width() + view->frameWidth()*2;
int height= view->horizontalHeader()->height() + view->verticalHeader()->height() + view->frameWidth()*2;

并相应地调整小部件的大小。

【讨论】:

不是完全正确的答案,但差不多! tableWidget->resize(m_ui->hlBottom->sizeHint().width(), m_ui->hlBottom->sizeHint().height()); with hlBottom = 包含叛逆的 QTableWidget 的水平布局。感谢您,我找到了解决问题的正确方法!我在我的forceUpdate() 电话之后这样做。非常感谢!!!也许您可以编辑您的答案,我会将其标记为解决方案等;)

以上是关于Qt:在委托绘制事件中渲染时如何增加 QTablewidget?的主要内容,如果未能解决你的问题,请参考以下文章

qt 中Qtable widget中如何加一个表

如何在 QT 中获取按钮的绘制事件

在qtable中打开csv文件时程序关闭

QT控件之Qtable Widget

Quasar QTable单击可点击行上的操作按钮

QGraphicsView 或 QWidget 完成绘制或渲染时是不是存在信号或事件?