Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Kirill_m от Апрель 11, 2012, 00:25



Название: [решено]Сигнал от класса наследуемого отQSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 00:25
И так..

1)есть таблица QTableView tableViewMain.

2)есть класс TableAmdinWidget(назовем для примера так =)) который управляет различными таблицами в приложении, в том числе и этой.

3)в объявлении этого класса подключается класс AmdinWidgetSqlModel наследуемый от QSqlQueryModel. В котором переопределены методы
Код:
bool setData(const QModelIndex &index,const QVariant &value, int role);

4)И в общем суть проблемы, при редактировании tableViewMain должны обновляться автоматически данные других таблиц. вызываю в конструкторе TableAmdinWidget
Код:
QObject::connect(model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),this,SLOT(initUpdate()));

не работает
Цитировать
QObject::connect' : none of the 3 overloads could convert all the argument types

Пояснения.

в TableAmdinWidget есть метод который получает указатель на таблицу.
так же там есть слот initViewRez(QTableView*) в который мы кладем этот указатель - забирает данные из базы и выводит на таблицу.
model - это указатель на класс AmdinWidgetSqlModel.
вообщем, как то всё.. как решить эту проблему. И как вообще можно, если можно, что бы при обновлении модели model , автоматом обновлялись другие.

Заранее спасибо.


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: LisandreL от Апрель 11, 2012, 06:29
Может с типами что-то.
Покажите объявление model и initUpdate()


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 07:33
TableAmdinWidget

.h
Код:
private slots:
    void initUpdate();


private:
    //модели для таблиц
   AmdinWidgetSqlModel *model;
.cpp
Код:
void TableAmdinWidget::initUpdate()
{

}

 AmdinWidgetSqlModel
.h
Код:
class  AmdinWidgetSqlModel : public QSqlQueryModel
{
    Q_OBJECT
public:
    AmdinWidgetSqlModel(QObject *parent=0);
    bool setData(const QModelIndex &index, const QVariant &value, int role);
    Qt::ItemFlags flags(const QModelIndex &index) const;
    void refresh();


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 10:17
тупой вопрос: TableAmdinWidget наследуется от чего?


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 10:27
Цитировать
тупой вопрос: TableAmdinWidget наследуется от чего?

Ни от чего, он как отдельный класс, чисто для управления. Задать размеры столбцов,сделать запрос в бд, установить модели к таблицам.


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 10:30
Цитировать
тупой вопрос: TableAmdinWidget наследуется от чего?

Ни от чего, он как отдельный класс, чисто для управления. Задать размеры столбцов,сделать запрос в бд, установить модели к таблицам.

чтобы у класса были слоты, надо этот класс унаследовать от QOblect. в доке написано... да и по сигнатуре connect тоже видно, что принимает функция указатели на наследники от QObject


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 10:48


Программа неожиданно завершилась.  завершился с кодом -1073741819

Как я понимаю падает когда, вызывается connect

.h
Код:
class TableAmdinWidget : public QObject
{


public:
    TableAmdinWidget(QObject *parent=0);
.cpp
Код:
TableAmdinWidget::TableAmdinWidget(QObject *parent)
                    : QObject(parent)
{

    QObject::connect(model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),this,SLOT(initUpdate()));


}


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 10:49
О сколько нам открытий чудных готовит документации мир...

макрос Q_OBJECT кто будет писать? Дедушка Ленин? и qmake сделать не забудь после этого


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 11:03
О сколько нам открытий чудных готовит документации мир...

макрос Q_OBJECT кто будет писать? Дедушка Ленин? и qmake сделать не забудь после этого

Ой да.. но смысл не изменился. Все равно падаем...


Приложение под винду(Qt Creator)


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 11:04
Показывай код


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: GreatSnake от Апрель 11, 2012, 11:07
Что-то вообще странное делается.
Создаётся класс и называется ...Widget. Только вот к виджету сей класс похоже никакого отношения не имеет.
ТС в курсе что такое "виджет" и чем QWidget отличается от QObject?


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 11:08
Код:
class TableAmdinWidget : public QObject
{

    Q_OBJECT

public:
    TableAmdinWidget(QObject *parent=0);


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об ред
Отправлено: mutineer от Апрель 11, 2012, 11:09
ок. В этом коде ошибок нет. давай дальше

З.Ы. так и будешь по паре строк в каждом сообщении выкладывать и заставлять форумчан собирать паззл?

Пардон, есть ошибка, даже две:
1) нет #include <QObject>
2) не закрыта фигурная скобка в конце описания класаа


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: GreatSnake от Апрель 11, 2012, 11:10
Код:
class TableAmdinWidget : public QObject
{

    Q_OBJECT

public:
    TableAmdinWidget(QObject *parent=0);
Мдя...
Граждане!!! Да он над нами издевается!!! :)


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 11:35
.h
Код:
#include <QtSql>
#include <QDebug>
#include <QtGui>
#include "amdinwidgetsqlmodel.h"
#include "libdelegate.h"

class TableAmdinWidget : public QObject
{

    Q_OBJECT

public:
    TableAmdinWidget(QObject *parent=0);

    void Active(QTableWidget* WidgetTitleMain,QTableView* ViewMain,QTableWidget* WidgetTitleOverload,QTableView*  ViewOverload,QTableWidget* WidgetTitleRez,QTableView* ViewRez24,QTableView* ViewRezAll,QTableView* ViewOverloadMass,QTableView* ViewRezNow);

    void Passive(QTableWidget* WidgetTitleMain,QTableView* ViewMain,QTableWidget* WidgetTitleOverload,QTableView* ViewOverload,QTableWidget* WidgetTitleRez,QTableView* ViewRez24,QTableView* ViewRezAll,QTableView* ViewOverloadMass,QTableView* ViewRezNow);

    void DataKey(QString str) {dataKey=str;}
    



private slots:
    void initUpdate();

private:

    AmdinWidgetSqlModel *model;

    void initViewMain(QTableView* ViewMain);
    void initTitleMain(QTableWidget* TitleMain);
    void initTitleOverload(QTableWidget* TitleOverload);
    void initTitleRez(QTableWidget* TitleRez);
    void initViewRez24(QTableView *Rez24);
    void initViewOverload(QTableView *Overload);
    void initViewRezAll(QTableView *RezAll);
    void initViewOverloadMass(QTableView *OverloadMass);
    void initViewRezNow(QTableView *RezNow);

    QString dataKey;
    QPushButton* pushButtionUp;
    QPushButton* pushButtionDown;

};


Код:
#include "tableamdinwidget.h"

TableAmdinWidget::TableAmdinWidget(QObject *parent)
                    : QObject(parent)
{
    model= new AmdinWidgetSqlModel;
    QObject::connect(model,SIGNAL(dataChanged(QModelIndex,QModelIndex)),this,SLOT(initUpdate()));
}

void TableAmdinWidget::initUpdate()
{
    qDebug()<<"мы в апдейте";
}

тык нашел у себя ошибку..приложение запускается. все хорошо креатор связал сигнал модели и слот.
Но в апдейт мы так и не попадаем.. не вызывается.

.h
 AmdinWidgetSqlModel

Код:
#include <QSqlQueryModel>
#include <QtSql>

class AmdinWidgetSqlModel : public QSqlQueryModel
{
    Q_OBJECT

public:
    AmdinWidgetSqlModel(QObject *parent=0);
    bool setData(const QModelIndex &index, const QVariant &value, int role);
    Qt::ItemFlags flags(const QModelIndex &index) const;
    void refresh();

    void setDataTime(QString str){datetime=str;}


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 11:37
а в setData ты этот сигнал испускаешь? опять какие-то огрызки кода дал...


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 11:46
мм.. в setData ?
про куски кода - думал не важно...


Код:
bool AmdinWidgetSqlModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
 

    
    QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 1);
    
    int id = data(primaryKeyIndex,0).toInt();

    clear();
    bool ok;
    
    switch ( index.column() )
       {
            case 1:
                {
                    ok = setDate(id,value.toString());
                    break;
                }

            case 3:
                {
                    ok = setTimeStart(id,value.toString());
                    break;
                }

            case 4:
                 {
                     ok = setCoordinatesStart(id,value.toString());
                     break;
                 }


            case 5:
                 {
                    ok = setTimeStop(id,value.toString());
                    break;
                 }

            case 6:
                 {
                    ok=setCoordinatesStop(id,value.toString());
                    break;
                 }
            case 7:
                {
                    ok=setTipe1(id,value.toFloat());
                    break;
                }
            case 8:
                {
                    ok=setTipeOut1(id,value.toFloat());
                    break;
                 }
            case 9:
                {
                    ok=setTipe2(id,value.toFloat());
                    break;
                }
           case 10:
                {
                    ok=setTipeFishOut2(id,value.toFloat());
                    break;
                }
            case 11:
                {
                    ok=setTipeFish3(id,value.toFloat());
                    break;
                }
            case 12:
                 {
                    ok=setTipeOut3(id,value.toFloat());
                    break;
                 }
            case 13:
                {
                    ok=setTipe4(id,value.toFloat());
                    break;
                }

            case 14:
                {
                    ok=setTipeOut4(id,value.toFloat());
                    break;
                 }
            case 15:
                {
                    ok=setTipe5(id,value.toFloat());
                    break;
                }
            case 16:
                {
                    ok=setTipeOut5(id,value.toFloat());
                    break;
                 }
            case 17:
                {
                    ok=setTipe6(id,value.toFloat());
                    break;
                }

            case 18:
                {
                    ok=setTipeOut6(id,value.toFloat());
                    break;
                 }
    }





    refresh();
    return ok;
}


void AmdinWidgetSqlModel::refresh()  -просто селект в базу данных


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 11:49
выбрасывай сигнал явно


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 11:52
выбрасывай сигнал явно
Поясни пожалуйста


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 11:54
выбрасывай сигнал явно
Поясни пожалуйста

В setData делай emit dataChanged(...)


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: GreatSnake от Апрель 11, 2012, 12:00
void AmdinWidgetSqlModel::refresh()  -просто селект в базу данных
Хм, а из-за этого не получишь рекурсию?


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 12:34
void AmdinWidgetSqlModel::refresh()  -просто селект в базу данных
Хм, а из-за этого не получишь рекурсию?

Не, не циклится. Всё нормально.

сигнал вызываем тут в setData, после обновления модели.
Код:
 .........
...........
..........
   refresh();
    emit dataChanged(index,index);
    return ok;

Спасибо огромное.
Мда косячки есть у меня) ну что ж буду исправляться)

Да мм.. можно еще вопрос ну около этой же темы.
Надо что бы последняя колонка в таблице была определенного цвета.
Как я понял надо переопределить QVariant data

.h AmdinWidgetSqlModel
Код:
  QVariant data(const QModelIndex &index, int role = Qt::DisplayRole ) const;

.cpp
Код:
QVariant FisheryWidgetSqlModel::data(const QModelIndex &index, int role) const
{
    switch (role)
    {
    case Qt::BackgroundRole:
        if(index.column()==19)
            return Qt::darkGreen; // пусть такой для примера.
        break;
    }

  return QVariant();
}
Естественно цвет ставит, но данные то не выводит.
Как же их вывести.
 Уже туплю...


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: mutineer от Апрель 11, 2012, 12:35
твой метод дата возвращает только цвет, данные не возвращает. Откуда ж им взяться на экране?


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: GreatSnake от Апрель 11, 2012, 13:01
Естественно цвет ставит, но данные то не выводит.
Как же их вывести.
 Уже туплю...
Вызывай для остальных случаев data() базового класса.


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 13:15
Код:
QVariant AmdinWidgetSqlModel::data(const QModelIndex &index, int role) const
{
    switch (role)
    {
    case Qt::BackgroundRole:
        if(index.column()==19)
            return Qt::darkGreen; // color for QBrush
        break;
    }
    switch ( index.column() ) //поменять тут
           {
                case 4:
                    {
                      // и тут выводим значение по индексу?
                    }
            }

    return QVariant();
}

Смысл в том что там должны отображаться данные и измениться фон в этой колонке..

ушел за кофе..


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: GreatSnake от Апрель 11, 2012, 13:26
Чего-то подтормаживаешь без кофе то)
Код
C++ (Qt)
QVariant AmdinWidgetSqlModel::data(const QModelIndex &index, int role) const
{
   if( role == Qt::BackgroundRole && index.column()==19 )
           return Qt::darkGreen; // color for QBrush
 
   return QSqlQueryModel::data( index, role );
}


Название: Re: Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.
Отправлено: Kirill_m от Апрель 11, 2012, 13:35
Чего-то подтормаживаешь без кофе то)
Код
C++ (Qt)
QVariant AmdinWidgetSqlModel::data(const QModelIndex &index, int role) const
{
   if( role == Qt::BackgroundRole && index.column()==19 )
           return Qt::darkGreen; // color for QBrush
 
   return QSqlQueryModel::data( index, role );
}

Огромное спасибо)
Ну наверно всё можно закрывать.