LINUX.ORG.RU

Qt, С++, указатели, отчаяние.


0

0

Помогите, пожалуйста, диалог отладить. Есть класс DepartmentDialog. В нем объявлены модель model1 (QSqlTableModel) и представление view1(QTableView). Еще у класса есть метод add_row. Так вот когда обращаешься к model1 и view1 внутри DepartmentDialog::DepartmentDialog - все работает корректно, а когда из метода add_row - сегфолтится. Всю голову уже сломал :(

departmentdialog.h

#ifndef DEPARTMENTDIALOG_H
#define DEPARTMENTDIALOG_H
#include <QDialog>
#include <QtGui>
#include <QtSql>

//static QSqlTableModel model;

class DepartmentDialog: public QDialog
{
    Q_OBJECT
    public:
    DepartmentDialog(QWidget *parent = 0);

    private:
    QSqlTableModel *model1;
    QTableView *view1;
    QPushButton *add_button;
    QHBoxLayout *main_layout;


    public slots:
        void add_row();
        //void del_row();
};


#endif // DEPARTMENTDIALOG_H

departmentdialog.cpp

#include "departmentdialog.h"

#include <QDialog>
#include <QtGui>
#include <QtSql>

#include <dbconnectdialog.h>
DepartmentDialog::DepartmentDialog(QWidget *parent):QDialog(parent)
{
    //db.close();
    QSqlDatabase mydb = QSqlDatabase::addDatabase("QMYSQL");
    mydb.setHostName("localhost");
    mydb.setDatabaseName("mydb");
    mydb.setUserName("root");
    mydb.setPassword("something");
    mydb.open();

    QLabel *main_label = new QLabel("тест");
    QPushButton *add_button = new QPushButton("add");
    QHBoxLayout *main_layout = new QHBoxLayout;
    setLayout(main_layout);
    main_layout->addWidget(main_label);
    main_layout->addWidget(add_button);

    QSqlTableModel *model1 = new QSqlTableModel;
    model1->setTable("Departments");
    model1->select();

    QTableView *view1 = new QTableView;
    main_layout->addWidget(view1);
    view1->setModel(model1);
    view1->show();
    //Следующая строка всегда работает корректно:
    int row = model1->rowCount();
    qDebug()<< row;
    //add_row();
    connect(add_button, SIGNAL(pressed()), this, SLOT(add_row()) );
}


void DepartmentDialog::add_row()
{
    //А из-за этой происходит сегфолт:
    int row = model1->rowCount();
    qDebug() << row;
    model1->insertRow(0);
    model1->submitAll();
}

Re: Qt, С++, указатели, отчаяние.

>QSqlTableModel *model1 = new QSqlTableModel;

this->model1=new...

Аналогично с view. Учите C++.

staseg ★★★★★ ()

Re: Qt, С++, указатели, отчаяние.

Убей не помню (я правда не пользуюсь таким вариантом ибо от лукавого, но всё же) в тейбл модели метод insertRow(int)...

int row = model1->rowCount(); встречается дважды, в кострукторе и в методе, не есть красиво... такая кострукция будет красивей qDebug() << model1->rowCount(); не находишь?

erfea ★★★★★ ()
Ответ на: Re: Qt, С++, указатели, отчаяние. от erfea

Re: Qt, С++, указатели, отчаяние.

Два раза встречается просто для проверки, я не мог понять, почему одна и та же строка выполняется по-разному.
>>кострукция будет красивей qDebug() << model1->rowCount();

Согласен, красивее. Но она нужна была только для отладки.

robert_foster ★★ ()
Ответ на: Re: Qt, С++, указатели, отчаяние. от robert_foster

Re: Qt, С++, указатели, отчаяние.

>>Согласен, красивее. Но она нужна была только для отладки.

ну дык так даже закоментировать её будет проще...

erfea ★★★★★ ()
Ответ на: Re: Qt, С++, указатели, отчаяние. от robert_foster

Re: Qt, С++, указатели, отчаяние.

Решение я и не писал, его указали до меня, просто дал совет на будущее, тебе саму будет проще если прислушаешься, а так дело твое конечно.

erfea ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.