Russian Qt Forum

Qt => Вопросы новичков => Тема начата: stanukih от Апрель 20, 2015, 15:40



Название: qtablewidget
Отправлено: stanukih от Апрель 20, 2015, 15:40
Проблема в следующем:
Имеется форма с qtablewidget и нулевым количеством ячеек. По кнопке изменяется количество ячеек. А дальше если запустить процедуру считывания данных из таблицы в класс ты вылетает ошибка. Если же перед этим покликать по всем ячейкам то все отрабатывает. Как это убрать? Была мысль эмулировать эти клики, но чет тоже не пошло.


Название: Re: qtablewidget
Отправлено: gil9red от Апрель 20, 2015, 16:02
Извините, телепаты в отпуске, покажите ваш код :)


Название: Re: qtablewidget
Отправлено: stanukih от Апрель 20, 2015, 16:07
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "put.h"
#include "QMessageBox"
#include "QString"
#include "QList"

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

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

void MainWindow::on_pushButton_clicked()
{
    ui->tableWidget->setRowCount(ui->spinBox->value());
    ui->tableWidget->setColumnCount(ui->spinBox->value());
    QMessageBox::information(this,"Сообщение","Таблица успешно создана");
    ui->pushButton_2->setEnabled(true);
    ui->pushButton_3->setEnabled(true);
    kolvo=ui->spinBox->value();
}


void MainWindow::on_pushButton_2_clicked()
{
    //QMessageBox::information(this,"Сообщение","Эта функция пока не реализована. Она будет готова к версии 1.0");
}

struct ver
{
public:
    int dlina;
    QList<int> put;
}vershina[10];



void MainWindow::on_pushButton_3_clicked()
{
    for (int i = 0; i < kolvo; ++i) {
        vershina.dlina=ui->tableWidget->item(0,i)->text().toInt();
    vershina.put.append(i);
    }

   /* for (int i = 0; i < kolvo; ++i) {
        for (int j = 0; j < ui->spinBox->value(); ++j) {
            if (vershina.dlina!=0)
                if ()
        }
    }*/
}




Название: Re: qtablewidget
Отправлено: gil9red от Апрель 20, 2015, 16:09
Пользуйтесь тегом <code> :)

Вылетает в on_pushButton_3_clicked()?
не пробовали запустить в отладке и посмотреть куда отладчик укажет при падении?

Вообще, на вскидку, тут проблема с строчкой vershina.dlina=ui->tableWidget->item(0,i)->text().toInt();
мне кажется, что тут kolvo больше количества столбцов


Название: Re: qtablewidget
Отправлено: stanukih от Апрель 20, 2015, 16:16
Тоже так думали, но если потапать по всем ячейкам то функция отрабатывает.
А при дебаге он выдает ошибку

Приложение остановлено, так как оно получило сигнал от операционной системы.

Сигнал:
SIGSEGV
Назначение:
Segmentation fault

Такое чувство что ему не выделяется память.


Название: Re: qtablewidget
Отправлено: gil9red от Апрель 20, 2015, 16:48
Когда увеличиваете размер таблицы, добавляете итемы? :)


Название: Re: qtablewidget
Отправлено: stanukih от Апрель 20, 2015, 16:51
Нет. А как это? (Если таблица с заданными размерами и ее не менять такая же штука).


Название: Re: qtablewidget
Отправлено: stanukih от Апрель 20, 2015, 18:58
Такое поведение и в linux (qt 4.7) и в windows (qt 5.4).

Насколько я понимаю итемы добавлять если используется qtableview, а в qtablewidget это автоматизировано или нет?


Название: Re: qtablewidget
Отправлено: gil9red от Апрель 20, 2015, 20:07
не-не ) нужно создать QTableWidgetItem и установить его через QTableWidget::setItem ;)

Код
C++ (Qt)
   QTableWidgetItem *newItem = new QTableWidgetItem(tr("%1").arg( (row+1) * (column+1) ) );
   tableWidget->setItem(row, column, newItem);
 

у вас в том цикле возвращался пустой указатель, поэтому прога и падала :)


Название: Re: qtablewidget
Отправлено: stanukih от Апрель 20, 2015, 20:28
а эту строку tableWidget->setItem(row, column, newItem);  в цикл? И row, column это номер столбца и строки? И подскажите где взять книгу в электронном виде по qt? Слышал что хорошая книга у Шлее, где можно ей в электронном варианте найти (не купить - студент и денег нет)?


Название: Re: qtablewidget
Отправлено: gil9red от Апрель 20, 2015, 22:17
ага, можно и в цикле :)
те книги в электронном виде я видел на рутрекере, просто сделайте поиск в гугле и найдете :)


Название: Re: qtablewidget
Отправлено: stanukih от Апрель 20, 2015, 22:57
Закинул в цикл теперь вылетает такая ошибка
QTableWidget: cannot insert an item that is already owned by another QTableWidget
Программа неожиданно завершилась.


Название: Re: qtablewidget
Отправлено: gil9red от Апрель 21, 2015, 05:17
Закинул в цикл теперь вылетает такая ошибка
QTableWidget: cannot insert an item that is already owned by another QTableWidget
Программа неожиданно завершилась.

Вы вынесли создание элемента за цикл и пытались его во все ячейки пропехнуть, вот он и ругнулся на это :)
QTableWidgetItem это ячейка таблицы, поэтому нужно для каждой ячейки создать элемент ;)

Код
C++ (Qt)
for (int i = 0; i < rows; i++)
   for (int j = 0; j < cols; j++) {
       QTableWidgetItem * item = new QTableWidgetItem( tr("%1").arg( (i+1) * (j+1) ) );
       tableWidget->setItem(i, j, item);
   }