我有一个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);
}
问题是,当表重新调整大小时,我会丢失滚动条。 我该如何解决这个问题?
答案 0 :(得分:0)
为什么在调整表格大小以适应其内容时,您是否期望滚动?
可能的问题是你的Ui在其他方面被破坏而且表格被遮挡了:它已被调整大小,但你看不到,因为表格视图所处的任何小部件都不能正确管理表格小部件。但我们无法确定,因为您没有最小化您的代码,以提供您正在做的事情的完整可编译示例。我们谈论的是&lt; 100行代码 - 当然,在你的问题中粘贴这样的main.cpp
并不是什么大问题。参见例如example 1或example 2。
这是一个糟糕的设计,因为你假设桌子适合屏幕。然而它不会:一旦调整大小工作,你将最终得到一个垂直巨大的窗口,不能使用,因为它的一些角落将延伸到屏幕之外,没有办法让他们看到内容或调整大小窗口。
最后,一旦在Ui设计中正确使用布局,对顶层下方任何窗口小部件的setGeometry()
调用都是无操作:它是控制子窗口小部件几何的布局。解决方案不是设置窗口小部件的几何体,而是设置设置其最小尺寸。
你正面临一个XY问题:你已经死定了一个解决方案,没有告诉我们你想要实现的是什么,并首先确保你所追求的是有意义的(如:它实际上会导致一个可用的Ui!)。