在QScrollBar可见性更改时获取QScrollBar宽度

时间:2015-11-04 16:57:08

标签: c++ qt signals-slots

我试图获得qscrollbar的宽度,因为它会改变可见性。我这样做是因为我想将qtablewidget的宽度更改为qscrollbar的宽度(如果可见)。

我正在使用qscrollbar中的rangeChanged(int min, int max)信号。如果max > min则qscrollbar可见。我的问题是,当我使用m_tableWidget->verticalScrollBar()->width()得到qscrollbar宽度时,该值不是当前宽度,而是触发rangeChanged信号之前的前一个宽度。

这就是我的信号插槽连接:

connect(m_tableWidget->verticalScrollBar(), SIGNAL(rangeChanged(int,int)),
        this, SLOT(verticalScrollBarChanged(int,int)));

这是插槽功能:

void ImageTableWidget::verticalScrollBarChanged(int min, int max)
{
    int verticalScrollBarWidth = 0;
    if (max-min)
        verticalScrollBarWidth = m_tableWidget->verticalScrollBar()->width();

    int horizontalHeaderWidth = m_tableWidget->horizontalHeader()->length();
    m_tableWidget->setFixedWidth(verticalScrollBarWidth + horizontalHeaderWidth);
}

有人知道如何在它变得可见/不可见时获得新的qscrollbar宽度吗?

1 个答案:

答案 0 :(得分:1)

Qt有更好的方法来处理某些小部件容器区域的异步调整大小。您应该删除所有明确处理它的代码,而是添加:

// m_tableWidget constructed
// at least first parameter for horizontal sizing should be Expanding. 
m_tableWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);

对于那个表小部件类,重载resizeEvent虚拟方法是有意义的,该方法将在每次调整大小时触发,并从那里调整单元格或resizeColumnsToContents()