Russian Qt Forum
Май 04, 2024, 08:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: qtablewidget  (Прочитано 4819 раз)
stanukih
Гость
« : Апрель 20, 2015, 15:40 »

Проблема в следующем:
Имеется форма с qtablewidget и нулевым количеством ячеек. По кнопке изменяется количество ячеек. А дальше если запустить процедуру считывания данных из таблицы в класс ты вылетает ошибка. Если же перед этим покликать по всем ячейкам то все отрабатывает. Как это убрать? Была мысль эмулировать эти клики, но чет тоже не пошло.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Апрель 20, 2015, 16:02 »

Извините, телепаты в отпуске, покажите ваш код Улыбающийся
Записан

stanukih
Гость
« Ответ #2 : Апрель 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 ()
        }
    }*/
}


Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Апрель 20, 2015, 16:09 »

Пользуйтесь тегом <code> Улыбающийся

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

Вообще, на вскидку, тут проблема с строчкой vershina.dlina=ui->tableWidget->item(0,i)->text().toInt();
мне кажется, что тут kolvo больше количества столбцов
« Последнее редактирование: Апрель 20, 2015, 16:12 от gil9red » Записан

stanukih
Гость
« Ответ #4 : Апрель 20, 2015, 16:16 »

Тоже так думали, но если потапать по всем ячейкам то функция отрабатывает.
А при дебаге он выдает ошибку

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

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

Такое чувство что ему не выделяется память.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Апрель 20, 2015, 16:48 »

Когда увеличиваете размер таблицы, добавляете итемы? Улыбающийся
Записан

stanukih
Гость
« Ответ #6 : Апрель 20, 2015, 16:51 »

Нет. А как это? (Если таблица с заданными размерами и ее не менять такая же штука).
« Последнее редактирование: Апрель 20, 2015, 17:43 от stanukih » Записан
stanukih
Гость
« Ответ #7 : Апрель 20, 2015, 18:58 »

Такое поведение и в linux (qt 4.7) и в windows (qt 5.4).

Насколько я понимаю итемы добавлять если используется qtableview, а в qtablewidget это автоматизировано или нет?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Апрель 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);
 

у вас в том цикле возвращался пустой указатель, поэтому прога и падала Улыбающийся
« Последнее редактирование: Апрель 20, 2015, 20:09 от gil9red » Записан

stanukih
Гость
« Ответ #9 : Апрель 20, 2015, 20:28 »

а эту строку tableWidget->setItem(row, column, newItem);  в цикл? И row, column это номер столбца и строки? И подскажите где взять книгу в электронном виде по qt? Слышал что хорошая книга у Шлее, где можно ей в электронном варианте найти (не купить - студент и денег нет)?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #10 : Апрель 20, 2015, 22:17 »

ага, можно и в цикле Улыбающийся
те книги в электронном виде я видел на рутрекере, просто сделайте поиск в гугле и найдете Улыбающийся
Записан

stanukih
Гость
« Ответ #11 : Апрель 20, 2015, 22:57 »

Закинул в цикл теперь вылетает такая ошибка
QTableWidget: cannot insert an item that is already owned by another QTableWidget
Программа неожиданно завершилась.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #12 : Апрель 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);
   }
 
« Последнее редактирование: Апрель 21, 2015, 05:22 от gil9red » Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.091 секунд. Запросов: 23.