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

时间:2017-03-31 11:53:38

标签: qt qtableview qsortfilterproxymodel

我有一个QTableView,其中包含用于搜索和排序的自定义QSortFilterProxyModel以及用于填充表格的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;
}

成功搜索后,我从代理模型发出一个信号到一个插槽,调整表高度以适应行的大小。     connect(proxyModel,SIGNAL(adjust()),this,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);
}

问题是,当表重新调整大小时,我会丢失滚动条。 我该如何解决这个问题?

在重新调整尺寸之前: Before re-sizing 重新调整大小后:

After re-sizing

1 个答案:

答案 0 :(得分:0)

为什么在调整表格大小以适应其内容时,您是否期望滚动?

可能的问题是你的Ui在其他方面被破坏而且表格被遮挡了:它已被调整大小,但你看不到,因为表格视图所处的任何小部件都不能正确管理表格小部件。但我们无法确定,因为您没有最小化您的代码,以提供您正在做的事情的完整可编译示例。我们谈论的是&lt; 100行代码 - 当然,在你的问题中粘贴这样的main.cpp并不是什么大问题。参见例如example 1example 2

这是一个糟糕的设计,因为你假设桌子适合屏幕。然而它不会:一旦调整大小工作,你将最终得到一个垂直巨大的窗口,不能使用,因为它的一些角落将延伸到屏幕之外,没有办法让他们看到内容或调整大小窗口。

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

你正面临一个XY问题:你已经死定了一个解决方案,没有告诉我们你想要实现的是什么,并首先确保你所追求的是有意义的(如:它实际上会导致一个可用的Ui!)。