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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: qtablewidget  (Прочитано 5308 раз)
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.041 секунд. Запросов: 23.