QTableView 的 resizeEvent() 问题

问题描述 投票:0回答:1

我有一个继承 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()
中识别这种特定情况是否已经发生,而无需设置计时器等?

c++ qt qt4 qtableview
1个回答
0
投票

检查滚动条是否可见适用于我的场景。

void DDUTableView::resizeEvent(QResizeEvent* ev)
{
    if (!horizontalScrollBar()->isVisible()) {

        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);

}

© www.soinside.com 2019 - 2024. All rights reserved.