C++/Qt Wyświetlanie jednowymiarowej tablicy double

0

Witam.

Moim zdaniem jest wyświetlenie tablicy, w której zapisane są wartości double w dwóch kolumnach. Parzyste wartości indeksu w jednej, nieparzyste w drugiej. Wartości jest ogromna ilość, więc lista musi być przewijana. Poczytałem trochę o modelach i ogólnie o QListView czy QTableView, ale szczerze mówiąc dalej nie wiem jak się do tego zabrać. Ogólnie jest to ostatnia rzecz w GUI mojego programu. Z resztą jakoś sobie poradziłem bazując na kursach dostępnych w necie.

0

Ale w czym masz dokładnie problem? W sprawdzaniu czy liczba jest ujemna czy dodatnia? W ustaleniu ilości wierszy? W dodaniu tabelki i wypełnieniu jej?

0

Zakładam, że masz jakaś strukturę trzymającą dane.
Teraz jedynie co musisz zrobić to opakować to klasą dziedziczącą po QAbstractItemModel lub po jej pochodnej (QAbstractTableModel).
Zacznij od QAbstractTableModel i zaimplementuj metody wirtualne: rowCount(), columnCount(), data().
Może się to wydawać skomplikowane, ale jest bardzo proste.

Jeśli pokażesz w czy trzymasz dane to mogę ci nawet pokazać jak to ma wyglądać.

0

MarekR22, w zwykłej jednowymiarowej tablicy zadeklarowanej "double *buf". Potrzebne mi 2 kolumny bo to są próbki wczytane z Wave'a. I są ułożone na przemian kanałami.

Blood, dokładnie tak. Dodałem sobie w QT Creatorze tabelkę do GUI, ale nie wiem teraz jak ją wypełnić danymi. Ilość elementów jest znana.

Moja aplikacja filtruje dźwięk i miałem to wszystko działające pod konsolą, ale "szef" zażyczył sobie GUI i się teraz męczę bo jestem w tym laikiem.

Dzięki za zainteresowanie:)

0

Oto przykładowe wpisanie czegoś do tabelki:

QTableWidgetItem *doWpisu = new QTableWidgetItem;
     doWpisu->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); 
     doWpisu->setData(Qt::DisplayRole, buf[0]);
     tabela->setItem(wiersz,kolumna,doWpisu);</cpp> // tabela do obiekt typu QTableWidget

Co oznaczają konkretne instrukcje możesz znaleźć w dokumentacji. Oczywiście zamiast buf[0] wstawiasz kolejne liczby. Można to wsadzić w pętlę.
1

@Blood: to jest najgorsze możliwe rozwiązanie dla dużej ilości danych.

Własny model powinien wyglądać tak:

class CustomDataModel : public QAbstractTableModel {
    Q_OBJECT
public:
     QAbstractTableModel(QObject *parent = 0) : QAbstractTableModel(parent),
         mBuf(0),
         mSize(0)
    {}

    void setSampleDatas(double *buf, uint size) {
        if (buf!=mBuf || size !=mSize)  {
              beginResetModel();
              mBuf = buf;
              mSize = size;
              endResetModel();
        }
    }

   int rowCount ( const QModelIndex & parent = QModelIndex() ) const {
       return mSize/2;
   }
   int QAbstractItemModel::columnCount ( const QModelIndex & parent = QModelIndex() ) const {
       return 2;
   }

   QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const {
        if (!index.isValid())
            return QVariant();
        
        if (index.row() >=mSize/2 || index.row() < 0)
            return QVariant();
        if (index.column() >=2 || index.column() < 0)
            return QVariant();
        
        if (role == Qt::DisplayRole) {
             return mBuf[index.row()*2 + index.column()];
        }
        return QVariant();
    }
private:
     double *mBuf;
     uint mSize;
};

Napisane na szybkiego nie sprawdzałem jak działa i czy się kompiluje.

0

Udało się. Przyznam się, że jednak wybrałem "krótszą" opcję. Dzięki śliczne Wam obu ;)

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