Zrobiłem swój model na podstawie klasy QAbstractItemModel
model działa, dane pojawiają się w odpowiednich komórkach (ale te dane wczytywane są z kontenera który zaimplementowany jest bezpośrednio w programie) Wygląda to tak
QStringList Matrix << ("1;x;7.5;=;7\n") << ("2;x;7;=;14\n");
Powyższe rozwiązanie mnie nie satysfakcjonuje i nie wiem jak rozwiązać problem przekazywaniem danych z pliku tekstowego do modelu.
Struktura wygląda tak
- Mam klasę o nazwie
myModel
która dziedziczy poQAbstractItemModel
- Mam klasę o nazwie
myData
jest to struktura na wczytywane dane, a tymi danymi jest tabliczka mnożenia. Struktura wygląda tak
class MyDataModel
{
public:
MyDataModel();
void setLiczba1(QString _liczba1);
void setDzialanie(QString _dzialanie);
void setLiczba2(QString _liczba2);
void setZnak(QString _znak);
void setWynik(QString _wynik);
QString getLiczba1() const;
QString getDzialanie() const;
QString getLiczba2() const;
QString getZnak() const;
QString getWynik() const;
private:
QString liczba1;
QString dzialanie;
QString liczba2;
QString znak;
QString wynik;
};
- Mam klasę
MainWindow
która dziedziczy poQMainWindow
i w tej klasie napisałemSLOT
do czytywania pliku tekstowego który nazywa sięOpenFile
- plik tekstowy wczytuje się poprawnie. Funkcja za wczytanie pliku wygląda tak
void OpenFile(void){
QString strData;
QStringList field;
MyDataModel data;
QVector<unsigned int> kolumny;
unsigned int sumColumns=0;
QRegularExpression regex("[\n|;]");
QString filter = "All Files (*.*) ;; Text File (*.txt) ;; CSV File (*.csv)";
QString getFileName = QFileDialog::getOpenFileName(this, QString("Open File"), QDir::homePath(), filter);
// qDebug()<< getFileName.toUtf8();
QFile openFile(getFileName);
if(!openFile.open(QFile::ReadOnly | QFile::Text)){
QMessageBox::information(this, "Otwieranie pliku...", "Nie otwarto pliku", QMessageBox::Close);
}
else{
QTextStream streamFile (&openFile);
while(!streamFile.atEnd()){ //wczytuję plik do momentu aż osiągnie on EOF (koniec pliku)
strData = streamFile.readLine(); //wczytuję plik linia po linii z utratą \n
for(int i=0; i<strData.size(); ++i){ //sprawdzam czy jest seperator kolumn, jeżeli jest, to zliczam ile ich jest
if(strData.at(i)==";" || strData.at(i)==":" || strData.at(i)=="," || strData.at(i)==" "){
columns++;
}
}
field << strData; //wczytuję dane linia po linii do kontenera
rows++; //zliczam ile jest wierszy w pliku
kolumny.push_back(columns); //zapisuję (wstępną) zliczaną po seperatorach ilość kolumn każdego wiersza, posłuży to do sprawdzenia czy plik ma wszystkie kolumny równe
// qDebug()<<"wiersz"<<rows<<"ma kolumn"<<columns;
columns=0; //zeruję ilość kolumn aby nie sumowało wszystkich kolumn z każdego wiersza na raz, gdyż ilość kolumn jest indywidualna dla każdego wiersza
//czyli nowy wiersz ma ZERO kolumn i zliczanie odbywa się na nowo dla każdego wiersza
}
for(int i=0; i<kolumny.size(); ++i){ //pętla sumująca wszystkie kolumny
sumColumns = sumColumns + kolumny.at(i)+1;
}
if(sumColumns % rows == 0){ //warunek sprawdzający czy plik ma wszystkie kolumny po równo
QMessageBox::information(this, "Ładowanie danych...", "Dane zostały załadowane", QMessageBox::Close);
}
if(sumColumns % rows == 1){
QMessageBox::warning(this, "Ładowanie danych...", "Dane nie zostały załadowane\nKolumny nie mają tego samego rozmiaru", QMessageBox::Ok);
return;
}
// openFile.flush();
openFile.close();
}
}
Nie wszystkie problemy rozwiązałem, bo to jest jeden z nich.
Jeżeli ktoś by zadał pytanie po do mi zliczanie wierszy i kolumn, to odpowiadam, jest mi to potrzebne do dwóch funkcji virtualnych
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
które znajdują się w klasie myModel
która dziedziczy po QAbstractItemModel
ilość zliczonych wierszy i kolumn chcę przekazać do tej klasy.
Więc pytanie jest takie. Jak połączyć klasę myModel
i myData
aby SLOT poprawnie wczytywał dane z pliku do klasy myModel
oraz można było przekazać ilość zliczonych wierszy i kolumn do funkcji columnCount
i rowCount
klasy myModel
?