qt - Сигнал от класса наследуемого от QSqlQueryModel об редактировании модели.


0

Итак...

  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(initViewRez(QTableView*)));

Не работает

QObject::connect : none of the 3 overloads could convert all the argument types

Пояснения.

  • В TableAmdinWidget есть метод который получает указатель на таблицу.
  • Так же там есть слот initViewRez(QTableView*) в который мы кладем этот указатель - забирает данные из базы и выводит на таблицу.
  • model - это указатель на класс AmdinWidgetSqlModel.

Вообщем, как-то всё... как решить эту проблему. И как вообще можно, если можно, что бы при обновлении модели model, автоматом обновлялись другие.

Источник
  •  3295
  •  2
  • 11 янв 2012 2012-01-11 04:43:31

2 ответа

0

Все легче, чем писали в комментарии.

  1. TableAmdinWidget должен наследоваться от QObject

.h

class TableAmdinWidget : public QObject {

Q_OBJECT

public: TableAmdinWidget(QObject *parent=0);

.cpp

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

  1. Так же в AmdinWidgetSqlModel в переопределенным

bool setData(const QModelIndex &index, const QVariant &value, int role);

явно вызываем сигнал dataChanged(QModelIndex,QModelIndex).

emit dataChanged(index,index)

P.S. Прошу прощение модераторов, что код в цитаты оформил. ну не получается его в код)

  • 11 янв 2012 2012-01-11 09:31:56
1
  • SIGNAL и SLOT должны иметь одинаковые аргументы (SLOT при этом может не иметь их вообще, но не может иметь аргумент, отличный от аргумента SIGNALa). Подробнее смотрите здесь.

  • Реализуйте контроллер для ваших моделей, который будет ловить dataChanged от одной модели и проецировать / изменять данные в других моделях.

  • В планах дизайна приложения можете не переходить от идеологии Model / View, используемой в Qt, а просто создать вспомогательный класс типа AggregatedModel, который и будет заниматься проецированием изменений.

Можно по подробней. Смысл в том что у меня 1 модель наследуемая от QSqlQueryModel. все остальные чистые QSqlQueryModel которые соединяются с QTableView (и они не редактируемые.) что самое интересное, что в старой версии программы где QSqlTableModel - редактируемая связывалась с QTableView . через тот же сигнал и похожий слот. все работало.. — 10 янв 20122012-01-10 19:02:58.000000
Думал над этим. сделал private slots: void initUpdate(); void TableAmdinWidget::initUpdate() { } результат тот же.. — 10 янв 20122012-01-10 18:17:18.000000