2017-03-31 5 views
0

Ich habe eine QTableView mit einem benutzerdefinierten QSortFilterProxyModel zum Suchen und Sortieren und einem QSqlQueryModel zum Auffüllen der Tabelle.QTableView Scrolling gestoppt nach dynamischer Größenanpassung

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; 
} 

Nach erfolgreicher Suche emittieren ich ein Signal von meinem Proxy-Modell zu einem Steckplatz, in dem er die Tischhöhe paßt die Größe der Zeilen passen. connect (proxyModel, SIGNAL (adjust()), dies, SLOT (dataChanged()));

Und wenn die Suchtaste geklickt

connect (UI-> searchBtn, & QToolButton :: geklickt haben, dieses, & AllVisitedPlaces :: getSearchOptions);

Ich nenne die Proxy-Modell Search Methode mit Suchparametern

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); 
} 

Das Problem ist, wenn die Tabelle wieder Größen ich Scrollen verlieren. Wie kann ich das beheben?

Vor dem erneuten Sizing: Before re-sizing Nach dem Wieder Sizing:

After re-sizing

Antwort

0

Warum würden Sie erwarten, Scrollen, wenn Sie die Tabelle der Größe verändert haben ihren Inhalt zu passen?

Das wahrscheinliche Problem ist, dass Ihr Ui auf andere Weise kaputt ist und die Tabelle verdeckt ist: Es wurde in der Größe geändert, aber Sie können das nicht sehen, weil das Widget in der Tabellenansicht nicht richtig verwaltet wird . Aber wir können es nicht mit Sicherheit sagen, da Sie Ihren Code nicht minimiert haben, um ein vollständiges kompilierbares Beispiel für das zu liefern, was Sie tun. Wir sprechen über < 100 Zeilen Code in allen - sicherlich wäre es keine große Sache, nur so ein main.cpp in Ihre Frage einfügen. Siehe z.B. example 1 oder example 2.

Das ist sowieso ein schlechtes Design, da Sie davon ausgehen, dass der Tisch auf den Bildschirm passt. Aber es wird nicht: sobald die Größenanpassung funktioniert, werden Sie mit einem vertikal großen Fenster enden, das nicht verwendet werden kann, da einige seiner Ecken über den Bildschirm hinausreichen, ohne sie zu erreichen, um den Inhalt zu sehen oder die Größe zu ändern Fenster.

Schließlich, sobald Sie Layouts in Ihrem Ui-Design richtig verwenden, ist der Aufruf setGeometry() auf jedem Widget unter Top-Level ein No-Op: Es ist das Layout, das die Kind Widget Geometrie steuert. Die Lösung besteht dann nicht darin, die Geometrie des Widgets festzulegen, sondern stattdessen als Mindestgröße festzulegen.

Sie stehen vor einem XY-Problem: Sie sind entschlossen, eine Lösung zu finden, ohne uns mitzuteilen, was Sie erreichen möchten, und zuerst sicherzustellen, dass das, wonach Sie suchen, Sinn ergibt (wie in: dass es tatsächlich zu einem brauchbaren Ui führen wird!).

+0

Mein TableView befindet sich bereits in einem GridLayout. Aber Sie haben Recht, setGeometry() hat das Problem verursacht. Ich habe einen vertikalen Abstandhalter unter dem Tabellenlayout hinzugefügt und die Layout-Ausdehnung auf [10: 1] eingestellt, dann habe ich stattdessen setMaximumHeight() verwendet und es funktioniert. Ich habe auch redundanten/fehlerhaften Code wie für die Änderung der Größe mit jeder Änderung in den Modelldaten entfernt und einfach adjustTableSize() aufgerufen, nachdem alle neuen Daten geladen sind. Vielen Dank und bitte entschuldigen Sie mich, ich bin nur ein Anfänger. –

Verwandte Themen