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: Nach dem Wieder Sizing:
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. –