Qt - porada na wczytanie pliku QFile

0

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

  1. Mam klasę o nazwie myModel która dziedziczy po QAbstractItemModel
  2. 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;
};
  1. Mam klasę MainWindow która dziedziczy po QMainWindow i w tej klasie napisałem SLOT 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 ?

0

czy ktoś z was wie jak to zrobić ?

0

już chyba sobie poradziłem, zrobiłem konstruktora klasy myModel który przyjmuje dane z kontenera, ilość wierszy i kolumn. tylko teraz nie wiem jak zrobić aby po wczytaniu pliku odrysowała się w tym samym czasie tabela z danymi i wyświetliła w tabeli... gdyby ktoś podpowiedział...

0

wyślij sygnał dataChanged

0

Pozwolę sobie inaczej:
@kq:

Pytają o rzeczy, które dotyczą konkretnych problemów, lub są odsyłani do dokumentacji.

każdy problem jest problemem konkretnym, poza tym "konkretność" zależy od sformułowania precyzji pytania. Chyba, że zdefiniujesz "konkretność" problemu ?

Ty się pytasz "jak poinformować widok, że zmieniły się dane w modelu?", dostajesz odpowiedź "wyślij dataChanged",

twoja odpowiedź jest arogancka, faktycznie dostaję od ciebie odpowiedź dataChanged ale myślę, że czysta ludzka kultura wymagała by szanować rozmówcę i podać razem z przykładem, bo samo dataChanged nic człowiekowi nie mówi... Rozumiałbym twój ton wypowiedzi w momencie, gdyby to samo pytanie pojawiało się setki razy i gdyby gdzieś była udzielona odpowiedź ale niestety, nie ma tu takiego pytania na ten temat, przynajmniej google mi nie pokazało... jak już to więcej się dowiedziałem z zagranicznych for, niż z tego, bo tam przynajmniej ktoś wrzuca przykłady i na tej podstawie można mniej więcej wyczuć co robić - dlatego powstał poniższy kod

a chwilę mówisz, że nie rozumiesz fragmentu dokumentacji mówiącego "model wysyła dataChanged gdy zmieniły się dane w modelu". Nie mam pojęcia jak to nawet interpretować

nigdzie nie napisałem, że nie rozumiem dokumentacji, coś sobie wmawiasz i jeszcze próbujesz wmówić to mnie, nawet przytaczałem ci tekst z dokumentacji. Bez przykładu, to ciężko zrozumieć.
Poza tym, konkluzja jest taka. Gdybym wiedział wszystko, to szczerze ? Olałbym to forum, bo o co miałbym pytać ? Zresztą, nawet gdybym o coś zapytał, to przez zwykłą ludzką niechęć, nieżyczliwość, opryskliwość itp itd... (jak w tym przypadku) nie otrzymałbym odpowiedzi - bo usłyszałbym "znajdź sobie na google albo idź do dokumentacji" - chyba ktoś z was nie rozumie sensu istnienia forum...

W dokumentacji są przykłady wołania dataChanged ale niestety u mnie one nie działają i wrzucam kod poniżej - zaznaczam, jest to kombinowanie, bez konkretnego przykładu, bo nie wiem jak to poprawnie użyć, dlatego PYTAM.

bool MyModel2::setData(const QModelIndex &index, const QVariant &value, int role)
{
    bool result = false;

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

        QModelIndex idx00 = createIndex(0,0);

        emit dataChanged(index, index, {role});
        emit dataChanged(idx00, idx00, {role});
        emit dataChanged(this->index(0,1), this->index(0,1), {role});
        emit dataChanged(this->index(0,2), this->index(0,2), {role});
        emit dataChanged(this->index(0,3), this->index(0,3), {role});
        emit dataChanged(this->index(0,4), this->index(0,4), {role});

        emit dataChanged(this->index(1,0), this->index(1,0), {role});
        emit dataChanged(this->index(1,1), this->index(1,1), {role});
        emit dataChanged(this->index(1,2), this->index(1,2), {role});
        emit dataChanged(this->index(1,3), this->index(1,3), {role});
        emit dataChanged(this->index(1,4), this->index(1,4), {role});
    }

    return result;
}
0

Pytasz się jak połączyć klasy myModel i myData a przedstawiasz kod dla klasy myDataModel.
Piszesz coś o tabliczce mnożenia a w tej klasie przechowujesz znak i dzialanie. Po co?
Skoro to tabliczka mnożenia to skąd ten przykład 1x7.5=7?

Generalnie model dla najprostszej tabliczki mnożenia ogranicza się do kontroli ile liczb ma być oraz:

QVariant MulTableModel::data(QModelIndex const& index, int role) const override
{
  if (!index.isValid() || role != Qt::DisplayRole) {
    return {};
  }
  return QString::number((index.row() + 1) * (index.column() + 1));
}

Prościej będzie jeśli napiszesz co chcesz osiągnąć, bo ja nie za bardzo wiem o co Ci chodzi.

0

@tajny_agent:
Dzięki za odezw. może pomożesz, może nie... to już twój świadomy wybór, ja już wątpię w zwykłą ludzką współpracę, wymianę wiedzy i doświadczeń... - jeżeli ma tak być, niech będzie, nic na siłę nie będę zmieniał dopóki ludzie sami w sobie nie zechcą dokonać zmian... ale do rzeczy. Pytasz...

Pytasz się jak połączyć klasy myModel i myData a przedstawiasz kod dla klasy myDataModel.

to moja niekonsekwencja nazewnictwa podczas pisania posta, bo zależało mi na czasie klasa myDataModel i jak napisałem myModel jest tym samym -> mój błąd bo nie zachowałem konsekwencji nazewnictwa podczas pisania treści posta.

Piszesz coś o tabliczce mnożenia a w tej klasie przechowujesz znak i dzialanie. Po co?

przechowuję to, ponieważ chcę się po prostu nauczyć tworzyć własny model, nie ma to innego celu, niż nauczenie się i zrozumienie tworzenia modelu.

Skoro to tabliczka mnożenia to skąd ten przykład 1x7.5=7?

w tym przykładzie chodziło bardziej o sprawdzenie jak zachowają się liczby rozdzielone kropką czy będą skonwertowane w całości czy też rozdzielone na cyfrę, kropkę, cyfrę, to samo dotyczyło liczb dziesiętnych typu 10, 15, etc... jak liczba 7.5 znalazła się w komórce, to znaczy, że funkcja split rozdziela to, tak jak oczekiwałem i nie musiałem myśleć nad algorytmem jak tu połączyć 7.5 czy 15 w jedną liczbę

Prościej będzie jeśli napiszesz co chcesz osiągnąć, bo ja nie za bardzo wiem o co Ci chodzi.

skoro nie nie wyraziłem się precyzyjnie, to rozpiszę krok po kroku co chcę osiągnąć. Więc chcę uzyskać taki punkt wyjścia jak na poniższym zrzucie.

screenshot-20201207131242.png

to co widać powyżej działa tylko dlatego, bo w konstruktorze klasy MyModel który dziedziczy po QAbstractItemModel mam kontener z danymi który wygląda tak

QStringList Matrix << ("1;x;7.5;=;7\n") << ("2;x;7;=;14\n");

co chcę uzyskać ? Chcę aby użytkownik sam wskazał plik z dowolną ilością wierszy i kolumn, a program mu to wyświetli czyli:

  1. klika przycisk "otwórz plik CSV"

screenshot-20201207134123.png

  1. po pojawieniu się okna dialogowego wyskakuje mu okienko wyboru pliku
  2. po wybraniu pliku program musi wyświetlić widok jak na pierwszym zrzucie

kod za otwarcie pliku jest w pierwszym poście, kod za obsługę umieszczenia danych w widoku, jest w poście 5

kod odpowiedzialny za załadowanie widoku w oknie głównym MainWindow wygląda tak jak niżej - ten kod jest w pliku MainWindow

absModel = new MyModel2(nullptr, field, rows, columns);

myView = new QTableView();
myView->setModel(absModel);

QObject::connect(pbOpenFile, &QPushButton::clicked, this, &MainWindow::OpenFile);
0
zkubinski napisał(a):

Pozwolę sobie inaczej:

@kq:

Pytają o rzeczy, które dotyczą konkretnych problemów, lub są odsyłani do dokumentacji.

każdy problem jest problemem konkretnym, poza tym "konkretność" zależy od sformułowania precyzji pytania. Chyba, że zdefiniujesz "konkretność" problemu ?

Jeśli pierwszy wynik w google prowadzi do dokumentacji to możesz założyć, że wstyd zadawać takie pytania i zastnowić się nad genezą powstania serwisów takich jak lmgtfy

Ty się pytasz "jak poinformować widok, że zmieniły się dane w modelu?", dostajesz odpowiedź "wyślij dataChanged",

twoja odpowiedź jest arogancka, faktycznie dostaję od ciebie odpowiedź dataChanged ale myślę, że czysta ludzka kultura wymagała by szanować rozmówcę i podać razem z przykładem, bo samo dataChanged nic człowiekowi nie mówi... Rozumiałbym twój ton wypowiedzi w momencie, gdyby to samo pytanie pojawiało się setki razy i gdyby gdzieś była udzielona odpowiedź ale niestety, nie ma tu takiego pytania na ten temat, przynajmniej google mi nie pokazało... jak już to więcej się dowiedziałem z zagranicznych for, niż z tego, bo tam przynajmniej ktoś wrzuca przykłady i na tej podstawie można mniej więcej wyczuć co robić - dlatego powstał poniższy kod

Czysta kultura wypadałaby włożyć trochę samodzielnej pracy, szczególnie jeśli wszystko jest dostępne w oficjalnej dokumentacji. Np. "co to jest QModelIndex?" - wystarczy przescrollować w górę, albo nawet kliknąć nazwę samej klasy.

a chwilę mówisz, że nie rozumiesz fragmentu dokumentacji mówiącego "model wysyła dataChanged gdy zmieniły się dane w modelu". Nie mam pojęcia jak to nawet interpretować

nigdzie nie napisałem, że nie rozumiem dokumentacji, coś sobie wmawiasz i jeszcze próbujesz wmówić to mnie, nawet przytaczałem ci tekst z dokumentacji. Bez przykładu, to ciężko zrozumieć.

Napisałeś, że nie rozumiesz dokumentacji:

The model emits signals to indicate changes. For example, dataChanged() is emitted whenever items of data made available by the model are changed — zkubinski 2020-12-06 22:28
rozumiesz coś ? Dla mnie to same ogólniki z których nic nie wynika, bez przykładu ciężko zrozumieć o co autorom chodzi... — zkubinski 2020-12-06 22:28

Poza tym, konkluzja jest taka. Gdybym wiedział wszystko, to szczerze ? Olałbym to forum, bo o co miałbym pytać ? Zresztą, nawet gdybym o coś zapytał, to przez zwykłą ludzką niechęć, nieżyczliwość, opryskliwość itp itd... (jak w tym przypadku) nie otrzymałbym odpowiedzi - bo usłyszałbym "znajdź sobie na google albo idź do dokumentacji" - chyba ktoś z was nie rozumie sensu istnienia forum...

Sensem forum nie jest wyszukiwanie fraz w dokumentacji, bo komuś się nie chce.

W dokumentacji są przykłady wołania dataChanged ale niestety u mnie one nie działają i wrzucam kod poniżej - zaznaczam, jest to kombinowanie, bez konkretnego przykładu, bo nie wiem jak to poprawnie użyć, dlatego PYTAM.

bool MyModel2::setData(const QModelIndex &index, const QVariant &value, int role)
{
    bool result = false;

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

        QModelIndex idx00 = createIndex(0,0);

        emit dataChanged(index, index, {role});
        emit dataChanged(idx00, idx00, {role});
        emit dataChanged(this->index(0,1), this->index(0,1), {role});
        emit dataChanged(this->index(0,2), this->index(0,2), {role});
        emit dataChanged(this->index(0,3), this->index(0,3), {role});
        emit dataChanged(this->index(0,4), this->index(0,4), {role});

        emit dataChanged(this->index(1,0), this->index(1,0), {role});
        emit dataChanged(this->index(1,1), this->index(1,1), {role});
        emit dataChanged(this->index(1,2), this->index(1,2), {role});
        emit dataChanged(this->index(1,3), this->index(1,3), {role});
        emit dataChanged(this->index(1,4), this->index(1,4), {role});
    }

    return result;
}

Nie można było tak od razu?

  1. Linkowałem już kanoniczny przykład w dokumentacji, więc ciekaw jestem dlaczego mówisz, że nie masz przykładów
  2. W dokumentacji można przeczytać "The optional roles argument can be used to specify which data roles have actually been modified. An empty vector in the roles argument means that all roles should be considered modified. The order of elements in the roles argument does not have any relevance." - emitujesz dataChanged tylko dla edit role (swoją drogą w przykładzie robią to explicite dla DisplayRole)
  3. dodatkowo, dokumentacja mówi, że setData powinno zwracać true w przypadku powodzenia
emit dataChanged(index, index, {role, Qt::DisplayRole});
// albo
emit dataChanged(index, index);
0

@zkubinski: Dalej nie wiem. Piszesz, że:

zkubinski napisał(a):

Chcę aby użytkownik sam wskazał plik z dowolną ilością wierszy i kolumn, a program mu to wyświetli

A wrzucasz kod z modelu, który ma na sztywno ustawioną ilość kolumn i co ma się w nich znajdywać.

0

może zapytam inaczej. Załóżmy, że model który wykonałem jest prawidłowy ale z jakiegoś powodu nie działa emit dataChanged
Chciałbym zadać kilka pytań, może mi odpowiecie.

  1. Czy funkcja OpenFile jest prawidłowo zaprojektowana ? W sensie, że jeżeli ta funkcja służy do wybierania pliku tekstowego, to czy słusznie wczytuję w tej funkcji zawartość pliku ?

Poniżej skrócona wersja aby łatwiej można było zrozumieć o co mi chodzi

void OpenFile(void)
{
    //gdzieś są funkcje odpowiedzialne za okno dialogowe QFileDialog
    QString strData;
    QStringList field;

    while(!streamFile.atEnd())
    {
        strData = streamFile.readLine();

        field << strData; // <- czy tutaj nie ma błędu logicznego ?
    }

}

i mam dodatkowe pytania do tej funkcji

  • Czy obiekt field powinien być zapisany jako zmienna lokalna funkcji ?
  • Czy obiekt field powinien być zapisany jako zmienna dostępna w klasie QMainWindow ?
  • Czy ta funkcja OpenFile powinna zwracać np wskaźnik do zawartości pliku ?
  1. Czy konstruktor klasy MyModel jest prawidłowo zaprojektowany ?
class MyModel : public QAbstractItemModel
{
public:
    MyModel2(QWidget *parent = nullptr, QStringList={""}, int _row=0, int _column=0);

// jakieś składowe klasy
};
  1. Czy patrząc na wszystkie rozwiązania - zasadne jest wywołanie w konstruktorze klasy QMainWindow mojego modelu w taki sposób ? Wiedząc, ze konstruktor wywołuje się tylko RAZ
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    absModel = new MyModel2(nullptr, field, rows, columns);
/*
gdzie:
field - są to dane wczytane z pliku przez funkcję OpenFile
rows - funkcja OpenFile po wczytaniu pliku powinna do tego obiektu zwrócić ilość wierszy
columns - funkcja OpenFile po wczytaniu pliku powinna do tego obiektu zwrócić ilość kolumn
*/
    myView = new QTableView();
    myView->setModel(absModel);
}

Myślę, że chyba gdzieś tutaj może być błąd ? Jeżeli tak, to w jaki sposób to poprawić ?

0

rozumiem, że nikt nie wie o co chodzi, nikt nie rozumie i wątek do zamknięcia ?

0

Nie zamykaj, kontynuuj, miło się czyta :)

1
zkubinski napisał(a):

może zapytam inaczej. Załóżmy, że model który wykonałem jest prawidłowy ale z jakiegoś powodu nie działa emit dataChanged

Chciałbym zadać kilka pytań, może mi odpowiecie.

  1. Czy funkcja OpenFile jest prawidłowo zaprojektowana ? W sensie, że jeżeli ta funkcja służy do wybierania pliku tekstowego, to czy słusznie wczytuję w tej funkcji zawartość pliku ?

IMHO nie i powinno być to rozdzielone.

Poniżej skrócona wersja aby łatwiej można było zrozumieć o co mi chodzi

void OpenFile(void)
{
    //gdzieś są funkcje odpowiedzialne za okno dialogowe QFileDialog
    QString strData;
    QStringList field;

    while(!streamFile.atEnd())
    {
        strData = streamFile.readLine();

        field << strData; // <- czy tutaj nie ma błędu logicznego ?
    }

}

i mam dodatkowe pytania do tej funkcji

  • Czy obiekt field powinien być zapisany jako zmienna lokalna funkcji ?
  • Czy obiekt field powinien być zapisany jako zmienna dostępna w klasie QMainWindow ?
  • Czy ta funkcja OpenFile powinna zwracać np wskaźnik do zawartości pliku ?

Obojętnie/nie/nie.

Zrobiłbym osobną klasę, która zajmowałaby się tym konkretnym formatem pliku. (wczytywanie/walidacja/dostęp do danych).
Taką klasę można by bez problemu wykorzystać w modelu.

  1. Czy konstruktor klasy MyModel jest prawidłowo zaprojektowany ?
class MyModel : public QAbstractItemModel
{
public:
    MyModel2(QWidget *parent = nullptr, QStringList={""}, int _row=0, int _column=0);

// jakieś składowe klasy
};

Tak średnio. Jak podasz QStringList+column to row możesz sobie wyliczyć.
A jeśli zrobiłbyś(tak jak wspomniałem wyżej) klasę ogarniającą dany format, która sama by sobie wyliczała liczbę kolumn i wierszy to wątpliwości by zupełnie zniknęły.

  1. Czy patrząc na wszystkie rozwiązania - zasadne jest wywołanie w konstruktorze klasy QMainWindow mojego modelu w taki sposób ? Wiedząc, ze konstruktor wywołuje się tylko RAZ
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    absModel = new MyModel2(nullptr, field, rows, columns);
/*
gdzie:
field - są to dane wczytane z pliku przez funkcję OpenFile
rows - funkcja OpenFile po wczytaniu pliku powinna do tego obiektu zwrócić ilość wierszy
columns - funkcja OpenFile po wczytaniu pliku powinna do tego obiektu zwrócić ilość kolumn
*/
    myView = new QTableView();
    myView->setModel(absModel);
}

Myślę, że chyba gdzieś tutaj może być błąd ? Jeżeli tak, to w jaki sposób to poprawić ?

Jeśli go tutaj używasz to tak. Jeśli nie to nie.
Tylko skąd ten konstruktor ma brać field/rows/columns?

2
zkubinski napisał(a):

rozumiem, że nikt nie wie o co chodzi, nikt nie rozumie i wątek do zamknięcia ?

Ja bym radził zacząć od opisania funkcjonalności jaką ma realizować twój program (z punktu widzenia użytkownika).
Przeleciałem szybko przez wątek i widzę tak dużo szumu informacyjnego, że nie wiem za co konkretnie się zabrać.
Na dodatek najwyraźniej tytuł wątku jest słabo związany z tym z czym masz problem.

Z tego co ustaliłem:

  • dziedziczenie po QAbstractItemModel to przesada, wystarczyło dziedziczyć po QAbstractTableModel.
  • jeśli wczytujesz nowe dane najprościej zrobić to pomiędzy: beginResetModel i endResetModel wtedy widok odświeży wszystko. W końcu stare dane lecą do kosza, a nowe są wczytywane.
  • twój kod to straszny chaos, który trudno ogarnąć. Funkcje są po prostu za długie, a wczytywanie CSV przekombinowane.

Na forum zamieszczałem już wiele przykładów użycia Q*ItemModel

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