Jak w tytule - czyli jak poinformować widok o tym, że wczytano dane do modelu.
konstruktor mojego modelu wygląda tak:
MyModel2::MyModel2(QWidget *parent, QStringList _data, int _row, int _column) : Matrix(_data), myRow(_row), myColumn(_column)
{
(void) parent;
QString strData;
QStringList field;
MyDataModel data;
QRegularExpression regex("[\n|;]");
for(int i=0; i<Matrix.size(); ++i){
strData = Matrix.at(i);
field = strData.split(regex, Qt::SkipEmptyParts);
data.setLiczba1(field.at(0));
data.setDzialanie(field.at(1));
data.setLiczba2(field.at(2));
data.setZnak(field.at(3));
data.setWynik(field.at(4));
myData.push_back(data);
}
}
funkcja setData
która ustawia dane w widoku wygląda tak
bool MyModel2::setData(const QModelIndex &index, const QVariant &value, int role)
{
bool result = false;
// beginResetModel();
if(index.isValid() && role == Qt::EditRole){
int row = index.row();
int column = index.column();
switch(column)
{
case 0:
myData[row].setLiczba1(value.toString());
qDebug()<<"kolumna ("<<column<<") ="<<myData.at(row).getLiczba1();
break;
case 1:
myData[row].setDzialanie(value.toString());
qDebug()<<"kolumna ("<<column<<") ="<<myData.at(row).getDzialanie();
break;
case 2:
myData[row].setLiczba2(value.toString());
qDebug()<<"kolumna ("<<column<<") ="<<myData.at(row).getLiczba2();
break;
case 3:
myData[row].setZnak(value.toString());
qDebug()<<"kolumna ("<<column<<") ="<<myData.at(row).getZnak();
break;
case 4:
myData[row].setWynik(value.toString());
qDebug()<<"kolumna ("<<column<<") ="<<myData.at(row).getWynik();
break;
default:
break;
}
emit dataChanged(index, index, {Qt::EditRole, Qt::DisplayRole});
}
// endResetModel();
return result;
}
SLOT który uruchamia obiekt QFileDialog
znajduje się w klasie MainWindow
i wygląda tak
void MainWindow::OpenFileDialog(void)
{
QString filter = "All Files (*.*) ;; Text File (*.txt) ;; CSV File (*.csv)";
QString getFileName = QFileDialog::getOpenFileName(this, QString("Open File"), QDir::homePath(), filter);
}
w MainWindow
widok ustawiam w konstruktorze po prostu tak
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
//jakiś tam kod
absModel = new MyModel2(nullptr, dane, 2, 5); //<- to tak nie może być, konstruktor wywołuje się RAZ
//a skoro wywołuje się raz, to jak poinformować widok, że tam zostały załadowane dane ?
myView = new QTableView();
myView->setModel(absModel);
QObject::connect(pbOpenFile, &QPushButton::clicked, this, &MainWindow::OpenFileDialog);
QObject::connect(pbQuit, &QPushButton::clicked, this, &QMainWindow::close);
//jakiś tam kod
}
Proszę zwrócić uwagę na konstruktor w MainWindow
i obiekt absModel
Wiedząc jak to wygląda, jak mogę poinformować widok, że wczytałem dane z pliku i co należy zrobić, żeby się pokazały w widoku ?
Poprawiłem kilka błędów projektowych - dodałem klasę zajmującą się plikiem CSV.
Może za dużo informacji tu przedstawiłem ale może dzięki temu ktoś naprowadzi mnie na rozwiązanie mojego problemu.
emit dataChanged
- coś nie chce działać. Próbowałem tworzyć obiekty modelu w slocie odpowiedzialnym za okno dialogowe QFileDialog
ale to chyba jest bez sensu...