J'ai un QTableView avec un QSortFilterProxyModel personnalisé pour la recherche et le tri et un QSqlQueryModel pour peupler la table.QTableView défilement arrêté après le redimensionnement dynamique
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;
}
Après une recherche réussie, j'émettre un signal de mon modèle de procuration à un emplacement où il ajuste la hauteur de la table à la taille des lignes. Connect (proxyModel, SIGNAL (adjust()), ceci, SLOT (dataChanged()));
Et lorsque le bouton de recherche est cliqué
de connexion (UI-> btnChercher, & QToolButton :: cliqu, & AllVisitedPlaces :: getSearchOptions);
J'appelle le modèle proxy méthode searchTable avec les paramètres de recherche
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);
}
Le problème est, lorsque les redimensionne de table, je perds le défilement. Comment puis-je résoudre ce problème?
Avant re-dimensionnement: Après re-dimensionnement:
Mon TableView est déjà dans un gridLayout. Mais vous avez raison, setGeometry() est ce qui a causé le problème. J'ai ajouté un espaceur vertical sous la disposition de la table et j'ai défini l'étirement de la mise en page sur [10: 1], puis j'ai utilisé setMaximumHeight() à la place et cela fonctionne. J'ai également supprimé le code redondant/mauvais comme pour changer la taille avec chaque changement dans les données du modèle et juste appelé adjustTableSize() après que toutes les nouvelles données sont chargées. Merci et excusez-moi, je ne suis qu'un débutant. –