2017-03-31 5 views
0

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: Before re-sizing Après re-dimensionnement:

After re-sizing

Répondre

0

Pourquoi voudriez-vous attendre à faire défiler lorsque vous avez modifié la taille de la table pour adapter son contenu? Le problème probable est que votre Ui est cassé par d'autres moyens et que la table est obscurcie: elle a été redimensionnée, mais vous ne pouvez pas voir cela parce que le widget de la table ne gère pas correctement le widget de la table. . Mais nous ne pouvons pas le dire avec certitude, car vous n'avez pas minimisé votre code pour fournir un exemple complet et compilable de ce que vous faites. Nous parlons de < 100 lignes de code en tout - ce ne serait sûrement pas une grosse affaire de simplement coller un tel main.cpp dans votre question. Voir par exemple example 1 ou example 2.

Ceci est un mauvais design de toute façon puisque vous présumez que la table s'adaptera à l'écran. Pourtant, cela ne fonctionnera pas: une fois le redimensionnement effectué, vous vous retrouverez avec une fenêtre verticalement énorme qui ne pourra pas être utilisée car certains de ses coins dépasseront l'écran, sans aucun moyen de les atteindre pour voir le contenu ou redimensionner le fenêtre.

Enfin, une fois que vous utilisez correctement les mises en page dans votre conception Ui, l'appel setGeometry() sur n'importe quel widget sous le niveau supérieur est un no-op: c'est la disposition qui contrôle la géométrie du widget enfant. La solution n'est alors pas de définir la géométrie du widget, mais de définir sa taille minimale à la place.

Vous êtes confronté à un problème XY: vous êtes complètement décidé sur une solution, sans nous dire ce que vous essayez d'accomplir et en vous assurant d'abord que ce que vous recherchez est logique (comme dans: que cela conduira réellement à un Ui utilisable!).

+0

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. –