Aktuzlizacja QTableView po zmianie danych

0

co mam:


struct Dane{
  std::string paramName;
  double value;
  std::string desc; 
};

std::vector<Dane> dane(255);
QTableView *viewDane;
class ModelDane : public QAbstractTableModel {....};

ModelDane model;

co potrzebuje:

  • zaktualizować widok z zachowaniem pozycji po zmianie wartości w data

Przychodzi mi do głowy taki pomysł aby odwietrzyć widok z zachowaniem pozycji

  // zapamietuje pozycje suwaków 
  QScrollBar *verticalScroll = viewDane->verticalScrollBar();
  QScrollBar *horizontalScroll = viewDane->horizontalScrollBar();
  int valueV = verticalScroll->value();
  int valueH = horizontalScroll->value();

  // ustawiam pusty model dla widoku
  viewDane->setModel(nullptr);
  // ustawiam własciwy model dla widoku 
  viewDane->setModel(modelRegs);

  // przywracam suwaki 
  verticalScroll->setValue(valueV);
  horizontalScroll->setValue(valueH);

Czy mozna to zrobić lepiej ?

1

Dokumentacja QAbstractTableModel ładnie wymienia, co trzeba zaimplementować.

Nie rozumiem co masz na myśli przez:

zaktualizować widok z zachowaniem pozycji po zmianie wartości w data

w funkcji setData trzeba wywołać emit dataChanged(index), wszyscy obserwatorzy widoku widzieli nową wartość.

Zresztą jak patrzę na końcówkę pytania, to to ewidentnie jest problem XY.

0

Jeżeli dane są modyfikowane za pomocą QTableView to wszystko działa i nie ma problemu zgodnie z dokumentacją:
ModelDane::setData(const QModelIndex &index, const QVariant &value, int role) { ... emit dataChanged(...) ...}

zaktualizować widok z zachowaniem pozycji po zmianie wartości w data

w kodzie robię data[17].value = 1234; // zmodyfikowałem dane poza modelem i widokiem Qt
zastanawiam sie teraz jak poinformować Qt że dane zostały zmodyfikowane dla uzytkownika w UI
Czy też to co che zrobić jest przeczne z koncepcją MVC ?

1
Marius.Maximus napisał(a):

w kodzie robię data[17].value = 1234; // zmodyfikowałem dane poza modelem i widokiem Qt
zastanawiam sie teraz jak poinformować Qt że dane zostały zmodyfikowane dla uzytkownika w UI
Czy też to co che zrobić jest przeczne z koncepcją MVC ?

No to zaraz po wykonaniu data[17].value = 1234; trzeba zrobić w modelu emit dataChanged(index(17, 0), index(17, 2)) i to powinno załatwić sprawę.

Jeśli ten kod jest poza modelem, to trzeba dopisać observer pattern do tego co obsługuje dane i model ma obserwować te zmiany, a gdy nastąpią wyemitować ten sygnał.

Było by prościej na solidnym przykładzie.
Może to jako przykład: https://4programmers.net/Forum/C_i_C++/213377-filtr_splotowy_obrazu_?p=933606#id933606

0

Dziękuje ! To wystarczyło emit dataChanged(index(17, 0), index(17, 2))

1 użytkowników online, w tym zalogowanych: 0, gości: 1