动态调整大小后 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!).
我有一个 QTableView,带有用于搜索和排序的自定义 QSortFilterProxyModel 以及用于填充 table.
的 QSqlQueryModelvoid 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!).