• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

QT dynamiczna tablica pobieranie/wyświetlanie wartości z tablicy

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,394 wizyt
pytanie zadane 10 kwietnia 2018 w C i C++ przez Undisputed Gaduła (3,040 p.)

Witajcie.
W QT mam zrobioną tabelę i sam sobie ustalam jej rozmiar może być np. 3x3
I teraz po kliknięciu przycisku OK chciałbym dwiema pętlami for zrobić tak, aby zczytywać te wartości, które wpisałem do komórek tabeli i żeby je przechowywać w tablicy dynamicznej, a potem np. wyświetlić zerowy element tej tablicy. Wszystko się dzieje w funkcji 

void MainWindow::on_pushButton_2_clicked()

Mam nadzieję, że rozumiecie o co chodzi.
Tutaj kod:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QComboBox>
#include <QSpinBox>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QDebug>


int IC, IV;
QString *DATA;
double *code;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    QString XMAX=ui->Moze->text();
    int xMax=XMAX.toDouble();

    QString YMAY=ui->wiersze->text();
    int yMay=YMAY.toDouble();

    {
        int colCount = xMax;
        int rowCount = yMay;
        ui->tableWidget->setColumnCount(colCount);
        ui->tableWidget->setRowCount(rowCount);


        for(int row = 0; row < rowCount; ++row)
        {
            for(int col = 0; col <colCount; ++col){
                QLineEdit *lineEdit = new QLineEdit(ui->tableWidget);
                ui->tableWidget->setCellWidget(row, col, lineEdit);
            }
        }
    }

}


void MainWindow::on_spinBox_valueChanged(int arg1)
{
    ui->Moze->setText(QString::number(arg1));
}


void MainWindow::on_tableWidget_itemSelectionChanged()
{

}

void MainWindow::on_spinBox_2_valueChanged(int arg1)
{
    ui->wiersze->setText(QString::number(arg1));
}

void MainWindow::on_pushButton_2_clicked()
{
    QString XMAX=ui->Moze->text();
    int xMax=XMAX.toDouble();

    QString YMAY=ui->wiersze->text();
    int yMay=YMAY.toDouble();

    IC = xMax; //kolumna
    IV = yMay; //rzad
    DATA = new QString[(IC+1)*(IV+1)];
    code = new double[(IC+1)*(IV+1)];
    for(int i = 0; i < IV+1; i++)
    {
        for(int j = 0; j <IC+1; j++){
            QLineEdit *lineEdit = (QLineEdit *)ui->tableWidget->cellWidget(i, j);
            QString DATA[i*(IC+1)+j] = lineEdit->text();
            //double code[i*(IC+1)+j] = DATA[i*(IC+1)+j].toDouble();
        }
    }
    //QLineEdit *lineEdit = (QLineEdit *)ui->tableWidget->cellWidget(9, 0);
    //QString CODE = lineEdit->text();
    //int code=CODE.toDouble();
    //ui->Edit8->setText(QString::number(code[0]));
    ui->Edit8->setText(DATA[0]);
}

Jak widzicie w za komentowanym kodzie wcześniej normalnie z jednej wybranej komórki zczytywałem i rzutowałem do jednej zmiennej i wyświetlałem i było ok. A z tablicą dynamiczną już tak łatwo nie jest.
Proszę o wszelkie wskazówki i porady.

1 odpowiedź

0 głosów
odpowiedź 10 kwietnia 2018 przez Bondrusiek Maniak (61,440 p.)

Witam,

nie możesz tak rzutować

//QLineEdit *lineEdit = (QLineEdit *)ui->tableWidget->cellWidget(9, 0);

Dodatkowo nie powinno się alokować pamięci na QString, gdyż ten typ wykorzystuje wzorzec pyłek który wykorzystuje zliczanie referenci do zarządzania pamięcią.

Jeszcze jedną rzecz która rzuca się w oczy jest wykorzystanie {} w bloku funkcji. Tylko niepotrzebnie ograniczasz zasięg zmiennych.

Na Twoim miejscu zacząłbym od łatwiejszych przykładów aby zrozumieć zasada działania komponentów Qt.

komentarz 10 kwietnia 2018 przez Undisputed Gaduła (3,040 p.)
Ok, a wiesz jak dane z tabeli włożyć do tablicy i odczytać z tablicy któryś element?
komentarz 10 kwietnia 2018 przez Bondrusiek Maniak (61,440 p.)

Lepszym rozwiązaniem zamiast tablicy według mnie byłoby użycie wektora QVector<QString>.

int liczba_column = 3;
int liczba_wierszy = 3;
QVector<QString> vec;
for(int i = 0; i < liczba_colum; i++)
{
for(int j =0; j < liczba_wierszy; ++j)
{
vec.push_back(tableWidget->item()->text());
}
}

//wyswietlenie zawartości sprawdzenie wartości
for(int i = 0 ; i < vec.size() ; ++i)
{
qDebug() << vec[i];
}

 

Podobne pytania

+1 głos
1 odpowiedź 863 wizyt
pytanie zadane 20 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,630 p.)
0 głosów
1 odpowiedź 356 wizyt
pytanie zadane 14 lutego 2021 w C i C++ przez poczatekcpp Nowicjusz (150 p.)
0 głosów
1 odpowiedź 1,222 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez karols32 Nowicjusz (120 p.)

93,188 zapytań

142,204 odpowiedzi

322,028 komentarzy

62,515 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2581p. - dia-Chann
  2. 2537p. - Łukasz Piwowar
  3. 2528p. - Łukasz Eckert
  4. 2514p. - CC PL
  5. 2476p. - Tomasz Bielak
  6. 2445p. - Łukasz Siedlecki
  7. 2443p. - rucin93
  8. 2373p. - Marcin Putra
  9. 2367p. - Adrian Wieprzkowicz
  10. 2310p. - Michal Drewniak
  11. 2210p. - Mikbac
  12. 2156p. - Anonim 3619784
  13. 1733p. - rafalszastok
  14. 1701p. - Michał Telesz
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...