Форум программистов, компьютерный форум, киберфорум
Наши страницы

Qt

Войти
Регистрация
Восстановить пароль
 
xam max
3 / 3 / 0
Регистрация: 27.09.2009
Сообщений: 200
#1

Ошибка сегментации при попытке создать QTableWidgetItem - C++ Qt

30.03.2014, 11:40. Просмотров 672. Ответов 7
Метки нет (Все метки)

Что-то никак не могу понять в чем дело, при вызове функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void MainWindow::FindXtX()
{
    int sum =0;
    for(int i=0;i<CountSelectedColumn;++i)
    {
        for(int j=0;j<CountSelectedColumn;++j)
        {
            for(int k=0;k<MLine;++k)
            {
                sum+=XtMatrix[j][k]*XMatrix[k][j];
            }
            XtXMatrix[i][j]=sum;
            sum=0;
        }
    }
    ui->XtXtableWidget->setRowCount(CountSelectedColumn);
    ui->XtXtableWidget->setColumnCount(CountSelectedColumn);
    ui->XtXtableWidget->verticalHeader()->hide();
    ui->XtXtableWidget->horizontalHeader()->hide();
    ui->XtXtableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    QTableWidgetItem *item;
    for(int i=0;i<CountSelectedColumn;++i)
        for(int j=0;j<CountSelectedColumn;++j)
        {
            item = new QTableWidgetItem;  //здесь вылезает сообщение об ошибке сегментации
            item->setText(QString::number(XtXMatrix[i][j]));
            item->setFlags(item->flags()^Qt::ItemIsEditable);
            ui->XtXtableWidget->setItem(i,j,item);
        }
}
возникает ошибка сегментации. При этом если запускать эту функцию в конструкторе MainWindows то ругается уже на строке сокрытия заголовков, почему так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 11:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка сегментации при попытке создать QTableWidgetItem (C++ Qt):

Ошибка при попытке загрузить QBitmap - C++ Qt
В отладочной версии пытаюсь сделать следующее: QFile file(&quot;d:/fileBitMap&quot;); if(file.open(QIODevice::ReadOnly)){ ...

Ошибка при попытке запуска откомпилированных файлов - C++ Qt
Всем привет! Решил занятся Qt, прочитал мануал, что сдесь был выложен, по совету скачал Qt SDK for Windows. Установил. Создал новый...

Ошибка при попытке изменить размер QVector - C++ Qt
Здравствуйте, возникает ошибка при попытке изменить размер массива QProcess. QVector&lt;QProcess&gt; myProcesses(1); ...

Крашится программа при добавлении элемента QTableWidgetItem - C++ Qt
При работе с таблицей, делаю такую вещь. Считываю текст выделенной ячейки, записываю его в соседнюю ячейку, при этом считывая значения из...

Ошибка при попытке добавления записи в базу данных (MySQL) - C++ Qt
Qt 4.8.5, MySQL Community Server (mysql-5.5.23-win32.msi). Собрал драйвер под 10 студию (gmake, nmake). Данные с базы получаю, но добавить...

Qt5 ошибка при попытке запуска .exe (visual C++ runtime library) - C++ Qt
Сегодня установил впервые qt5, (раньше не какого qt/опыта вообще не было) после успешного билда программы, и безпроблемного запуска...

7
Чистый
Автор FAQ
2709 / 1405 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 1
30.03.2014, 11:51 #2
C++ (Qt)
1
item = new QTableWidgetItem
а должно быть

C
1
item = new QTableWidgetItem(...)
посмотрите конструкторы у QTableWidgetItem
0
xam max
3 / 3 / 0
Регистрация: 27.09.2009
Сообщений: 200
30.03.2014, 12:55  [ТС] #3
Все равно ошибка сегментации, ну и потом что такое этот type ? Какие значения он может принимать?
я например так делаю.
new QTableWidgetItem(1).

Добавлено через 6 минут
К тому же в другом месте работает и без ().
0
Байт
Эксперт C
16555 / 10825 / 1640
Регистрация: 24.12.2010
Сообщений: 20,910
30.03.2014, 13:24 #4
C++ (Qt)
1
2
3
4
5
6
7
  for(int i=0;i<CountSelectedColumn;++i)
        for(int j=0;j<CountSelectedColumn;++j)        {
           QTableWidgetItem *item; // Место его здесь
            item = new QTableWidgetItem;  //здесь вылезает сообщение об ошибке сегментации
            item->setText(QString::number(XtXMatrix[i][j]));
            item->setFlags(item->flags()^Qt::ItemIsEditable);
        }
Ты ж свой Item все время затираешь!
0
Чистый
Автор FAQ
2709 / 1405 / 73
Регистрация: 08.09.2011
Сообщений: 3,733
Записей в блоге: 1
30.03.2014, 14:09 #5
Байт не прав ты, он ее потом добавляет в QtableWidget так что на сл итерации старый указатель не нужен.
xam max,
да ничего не надо просто скобки пустые поставь:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
QTableWidgetItem *item;
for(int i =0; i< ui->tableWidget->columnCount();i++)
{
    for(int j=0;j<ui->tableWidget->rowCount();j++)
    {
        item = new QTableWidgetItem();
        item->setText(QString("%1").arg(ui->tableWidget->columnCount()+ui->tableWidget->rowCount()));
        ui->tableWidget->setItem(j,i,item);
    }
}
вот рабочий код
0
xam max
3 / 3 / 0
Регистрация: 27.09.2009
Сообщений: 200
30.03.2014, 15:41  [ТС] #6
Верю вам, но у меня все равно ошибка выскакивает, причем уже на 1 итерации (((
Вообще кстати ничего Qt шного не хочет создавать прога в этой функции, может есть какие то ограничения на определение своих функций в mainwindow.h ?
0
RazrFalcon
1381 / 1238 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
30.03.2014, 16:02 #7
Выложите полный код, там видно будет.
На той строке вылетать не может в принципе.
Никаких ограничений тоже нет.

У вас XtXMatrix точно нужного размера, а то может при обращении к несуществующему элементу падает?
0
xam max
3 / 3 / 0
Регистрация: 27.09.2009
Сообщений: 200
30.03.2014, 16:13  [ТС] #8
mainwindows.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void on_ExitpushButton_clicked();
 
    void on_ConsiderpushButton_clicked();
 
private:
    void BeginInitialize();
    void ReadDataMatrix();
    void FindTranspon();
    void FindXtX();
    void FindInverse();
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
mainwindow.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
const int MLine = 53;
const int MColumn = 6;
const int CountSelectedColumn = 3;
double DataMatrix[MLine][MColumn] ={0};
double XMatrix[MLine][CountSelectedColumn] ={0};
double YMatrix[MLine] = {0};
double XtMatrix[CountSelectedColumn][MLine] = {0};
double XtXMatrix[CountSelectedColumn][CountSelectedColumn] = {0};
double InverseMatrix[CountSelectedColumn][CountSelectedColumn] = {0};
double InverseMultTranspon[CountSelectedColumn][MLine] = {0};
double Result[CountSelectedColumn] = {0};
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ReadDataMatrix();
    BeginInitialize();
}
void MainWindow::BeginInitialize()
{
    ui->YtableWidget->setRowCount(MLine);
    ui->YtableWidget->setColumnCount(1);
    ui->YtableWidget->verticalHeader()->hide();
    ui->YtableWidget->horizontalHeader()->hide();
    ui->YtableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->XtableWidget->setRowCount(MLine);
    ui->XtableWidget->setColumnCount(CountSelectedColumn);
    ui->XtableWidget->verticalHeader()->hide();
    ui->XtableWidget->horizontalHeader()->hide();
    ui->XtableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    for(int i=0;i<MLine;++i)
    {
        YMatrix[i] = DataMatrix[i][1];
        QTableWidgetItem *item = new QTableWidgetItem; // Здесь все нормально
        item->setText(QString::number(DataMatrix[i][1]));
        item->setFlags(item->flags()^Qt::ItemIsEditable);
        ui->YtableWidget->setItem(i,0,item);
    }
    int SelectedColumn[] = {2,3,5};
    for(int i=0;i<MLine;++i)
        for(int j=0;j<CountSelectedColumn;++j)
        {
            XMatrix[i][j] = DataMatrix[i][SelectedColumn[j]];
            QTableWidgetItem *item = new QTableWidgetItem; // и здесь тоже
            item->setText(QString::number(DataMatrix[i][SelectedColumn[j]]));
            item->setFlags(item->flags()^Qt::ItemIsEditable);
            ui->XtableWidget->setItem(i,j,item);
        }
}
 
void MainWindow::FindTranspon()
{
    for(int i=0;i<MLine;++i)
        for(int j=0;j<CountSelectedColumn;++j)
        {
            XtMatrix[i][j] = XMatrix[j][i];
        }
}
 
void MainWindow::FindXtX() // в этой функции невозможно выделить память вообще ни для чего qtшного
{
    int sum =0;
    for(int i=0;i<CountSelectedColumn;++i)
    {
        for(int j=0;j<CountSelectedColumn;++j)
        {
            for(int k=0;k<MLine;++k)
            {
                sum+=XtMatrix[j][k]*XMatrix[k][j];
            }
            XtXMatrix[i][j]=sum;
            sum=0;
        }
    }
    ui->XtXtableWidget->setRowCount(CountSelectedColumn);
    ui->XtXtableWidget->setColumnCount(CountSelectedColumn);
    ui->XtXtableWidget->verticalHeader()->hide();
    ui->XtXtableWidget->horizontalHeader()->hide();
    ui->XtXtableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    QTableWidgetItem *item;
    for(int i=0;i<CountSelectedColumn;i++)
        for(int j=0;j<CountSelectedColumn;j++)
        {
            item = new QTableWidgetItem(); 
            item->setText(QString::number(XtXMatrix[i][j]));
            item->setFlags(item->flags()^Qt::ItemIsEditable);
            ui->XtXtableWidget->setItem(i,j,item);
        }
}
void MainWindow::on_ConsiderpushButton_clicked()
{
    FindTranspon();
    FindXtX();
}
0
30.03.2014, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2014, 16:13
Привет! Вот еще темы с ответами:

Картинка в QTableWidgetItem - C++ Qt
В ячейку таблицы нужно вставить картинку. Написал QPixmap pix; pix.load( fileName ); pix.scaled(200, 200); QTableWidgetItem* item...

Не работает QTableWidgetItem - C++ Qt
Создал форму таблицы, пытаюсь добавить в неё число, получаемое по нажатию кнопки, переменной передается значение из SpinBox, в слоте кнопки...

Картинка в QTableWidgetItem - C++ Qt
Добрый день, подскажите, пожалуйста, как установить картинку для любой ячейки QTableWidget, чтобы картинка подогналась по размерам...

Особенности работы с QTableWidgetItem - C++ Qt
Всем доброго времени суток. Недавно стал изучать QT, перешёл с MFC. Вопрос заключается в следующем: в проекте создал с помощью класса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru