动态调整大小后 QTableView 滚动停止

QTableView scrolling stopped after dynamic resizing

我有一个 QTableView,带有用于搜索和排序的自定义 QSortFilterProxyModel 以及用于填充 table.

的 QSqlQueryModel
void ProxyModel::searchTable(QString name, QString type, QString date, QString time ){
    if(name_ != name)
        name_ = name;
    if(type_ != type)
        type_ = type;
    if(date_ != date)
        date_ = date;
    if(time_ != time)
        time_ = time;
    invalidateFilter();
}
bool ProxyModel::filterAcceptsRow(int source_row,
                                  const QModelIndex &source_parent) const{
    QModelIndex indName = sourceModel()->index(source_row,
                                               0, source_parent);
    QModelIndex indType= sourceModel()->index(source_row,
                                               4, source_parent);
    QModelIndex indDate = sourceModel()->index(source_row,
                                               2, source_parent);
    QModelIndex indTime = sourceModel()->index(source_row,
                                               3, source_parent);
    if(
              sourceModel()->data(indName).toString().toLower().contains(name_.toLower())
            &&sourceModel()->data(indType).toString().toLower().contains(type_.toLower())
            &&sourceModel()->data(indDate).toString().toLower().contains(date_.toLower())
            &&sourceModel()->data(indTime).toString().toLower().contains(time_.toLower())
       )
    {
        emit adjust();
        return true;
    }
    return false;
}

搜索成功后,我从我的代理模型向插槽发出信号,在插槽中调整 table 高度以适应行的大小。 connect(proxyModel, SIGNAL(adjust()), 这个, SLOT(dataChanged()));

点击搜索按钮时

connect(ui->searchBtn, &QToolButton::clicked, this, &AllVisitedPlaces::getSearchOptions);

我用搜索参数调用代理模型searchTable方法

void AllVisitedPlaces::getSearchOptions()
{
    proxyModel->searchTable(ui->nameLineEdit->text(),
                            ui->typeLineEdit->text(),
                            ui->dateLineEdit->text(),
                            ui->timeLineEdit->text());
     adjustTableSize();
}

void AllVisitedPlaces::dataChanged()
{
    adjustTableSize();
    this->verticalHeader->setSectionResizeMode(QHeaderView::ResizeToContents);

}

void AllVisitedPlaces::adjustTableSize()
{
     QRect rect = ui->table->geometry();
     int height = 0;
     for (int i =0; i < proxyModel->rowCount() ; i++)
         height+= ui->table->rowHeight(i);
     rect.setHeight(18 + ui->table->horizontalHeader()->height() + height);
         ui->table->setGeometry(rect);
         verticalHeader->setSectionResizeMode(QHeaderView::Stretch);
}

问题是,当 table 重新调整大小时,我无法滚动。 我该如何解决?

调整大小之前: 调整大小后:

当您调整 table 以适应其内容时,为什么您希望滚动?

可能的问题是您的 Ui 以其他方式损坏并且 table 被遮挡:它已调整大小,但您看不到,因为 table 视图所在的位置无法正确管理 table 小部件。但我们不能确定,因为您没有最小化代码以提供您正在做的事情的完整可编译示例。我们总共谈论的是 <100 行代码 - 当然,在您的问题中粘贴这样的 main.cpp 肯定没什么大不了的。参见例如example 1 or example 2.

无论如何,这是一个糟糕的设计,因为您假设 table 适合屏幕。但它不会:一旦调整大小生效,您最终会得到一个无法使用的垂直巨大 window,因为它的某些角会延伸到屏幕之外,无法到达它们以查看内容或调整 window.

的大小

最后,一旦您在 Ui 设计中正确使用布局,对顶层以下任何小部件的 setGeometry() 调用都是空操作:它是控制子小部件几何形状的布局.解决方案不是设置小部件的几何形状,而是设置其最小尺寸

您正面临一个 XY 问题:您对解决方案死心塌地,却没有告诉我们您要实现的目标是什么,也没有首先确保您所追求的是有意义的(如: 它实际上会导致可用 Ui!).