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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [решено]Сигнал от класса наследуемого отQSqlQueryModel об редактировании модели.  (Прочитано 12339 раз)
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 , автоматом обновлялись другие.

Заранее спасибо.
« Последнее редактирование: Апрель 16, 2012, 23:13 от Kirill_m » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Апрель 11, 2012, 06:29 »

Может с типами что-то.
Покажите объявление model и initUpdate()
Записан
Kirill_m
Гость
« Ответ #2 : Апрель 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();
« Последнее редактирование: Апрель 11, 2012, 07:35 от Kirill_m » Записан
mutineer
Гость
« Ответ #3 : Апрель 11, 2012, 10:17 »

тупой вопрос: TableAmdinWidget наследуется от чего?
Записан
Kirill_m
Гость
« Ответ #4 : Апрель 11, 2012, 10:27 »

Цитировать
тупой вопрос: TableAmdinWidget наследуется от чего?

Ни от чего, он как отдельный класс, чисто для управления. Задать размеры столбцов,сделать запрос в бд, установить модели к таблицам.
Записан
mutineer
Гость
« Ответ #5 : Апрель 11, 2012, 10:30 »

Цитировать
тупой вопрос: TableAmdinWidget наследуется от чего?

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

чтобы у класса были слоты, надо этот класс унаследовать от QOblect. в доке написано... да и по сигнатуре connect тоже видно, что принимает функция указатели на наследники от QObject
Записан
Kirill_m
Гость
« Ответ #6 : Апрель 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()));


}
Записан
mutineer
Гость
« Ответ #7 : Апрель 11, 2012, 10:49 »

О сколько нам открытий чудных готовит документации мир...

макрос Q_OBJECT кто будет писать? Дедушка Ленин? и qmake сделать не забудь после этого
Записан
Kirill_m
Гость
« Ответ #8 : Апрель 11, 2012, 11:03 »

О сколько нам открытий чудных готовит документации мир...

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

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


Приложение под винду(Qt Creator)
Записан
mutineer
Гость
« Ответ #9 : Апрель 11, 2012, 11:04 »

Показывай код
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #10 : Апрель 11, 2012, 11:07 »

Что-то вообще странное делается.
Создаётся класс и называется ...Widget. Только вот к виджету сей класс похоже никакого отношения не имеет.
ТС в курсе что такое "виджет" и чем QWidget отличается от QObject?
Записан

Qt 5.11/4.8.7 (X11/Win)
Kirill_m
Гость
« Ответ #11 : Апрель 11, 2012, 11:08 »

Код:
class TableAmdinWidget : public QObject
{

    Q_OBJECT

public:
    TableAmdinWidget(QObject *parent=0);
Записан
mutineer
Гость
« Ответ #12 : Апрель 11, 2012, 11:09 »

ок. В этом коде ошибок нет. давай дальше

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

Пардон, есть ошибка, даже две:
1) нет #include <QObject>
2) не закрыта фигурная скобка в конце описания класаа
« Последнее редактирование: Апрель 11, 2012, 11:14 от mutineer » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #13 : Апрель 11, 2012, 11:10 »

Код:
class TableAmdinWidget : public QObject
{

    Q_OBJECT

public:
    TableAmdinWidget(QObject *parent=0);
Мдя...
Граждане!!! Да он над нами издевается!!! Улыбающийся
Записан

Qt 5.11/4.8.7 (X11/Win)
Kirill_m
Гость
« Ответ #14 : Апрель 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;}
« Последнее редактирование: Апрель 11, 2012, 11:37 от Kirill_m » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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