resizeEvent()的QTableView问题

时间:2014-09-29 13:02:02

标签: c++ qt qt4 qtableview

我有一个继承QTableView的对象,并覆盖resizeEvent()方法,如果调整整个表的大小,则将表列的宽度设置为可用空间的百分比。

代码如下:

void DDUTableView::resizeEvent(QResizeEvent* ev)
{

  int num_columns = NUM_ELEMENTS(COLUMN_WIDTHS);

  if (num_columns > 0) {

    int width = ev->size().width();
    int used_width = 0;

    // Set our widths to be a percentage of the available width
    for (int i = 0; i < num_columns - 1; i++) {
        int column_width = (width * COLUMN_WIDTHS[i]) / 100;
        this->setColumnWidth(i, column_width);
        used_width += column_width;
    }

    // Set our last column to the remaining width
    this->setColumnWidth(num_columns - 1, width - used_width);
}

// Call our base resizeEvent to handle the vertical resizing which 
// we don't bother with here
QTableView::resizeEvent(ev);

}

这一切都正常,直到用户手动调整其中一列并将其拉伸到视口以外(调出水平滚动条)。然后,这将触发我的resizeEvent()调用,该调用将列宽重置为百分比默认值。

我可以通过连接表头上的sectionResized()信号并设置一个运行的计时器来解决这个问题。如果在计时器处于活动状态时调用resizeEvent(),那么我不会重新计算表格宽度。

以下代码:

connect(horizontalHeader(), SIGNAL(sectionResized(int, int, int)), this, SLOT(slotSectionResized(int, int, int)));

void DDUTableView::slotSectionResized(int /*logicalIndex*/, int /*oldSize*/, int /*newSize*/)
{
    timer_->start(500);
}


void DDUTableView::resizeEvent(QResizeEvent* ev)
{

if (timer_->isActive()) {
    return;
}
// etc

这可行,但很麻烦。无论如何,简单的问题是,如果用户手动调整超出视口范围的列标题,是否可以阻止调用resizeEvent()?或者,如果没有,是否可以在resizeEvent()中识别是否已经发生了这种特殊情况而不必设置定时器等?

0 个答案:

没有答案