• 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

Object Storage Arubacloud
0 głosów
1,152 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,370 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,370 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ź 606 wizyt
pytanie zadane 20 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,610 p.)
0 głosów
1 odpowiedź 231 wizyt
pytanie zadane 14 lutego 2021 w C i C++ przez poczatekcpp Nowicjusz (150 p.)
0 głosów
1 odpowiedź 839 wizyt
pytanie zadane 26 stycznia 2021 w C i C++ przez karols32 Nowicjusz (120 p.)

92,563 zapytań

141,416 odpowiedzi

319,595 komentarzy

61,948 pasjonatów

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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...