Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ как отловить dataChanged?

Автор: dzyk 12.9.2008, 15:35

Вообщем, хочу сделать так, чтобы TableModel после изменения одной из ячеек строке в 100ой, например - виджет снова вернулся на 100ую строку, которую редактировал пользователь. Для этого хочу отловить событие
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) [signal]

.. и ничего не получается :(

сигнал принимает объект главного окна... отлично обрабатываются события от QAbstractItemView.
А вот QSqlTableModel и QAbstractItemModel ну никак ... помогите.!

Автор: Litkevich Yuriy 12.9.2008, 17:39

Цитата(dzyk @ 12.9.2008, 19:35) *
и ничего не получается
Цитата(dzyk @ 12.9.2008, 19:35) *
ну никак
а точнее

Автор: dzyk 12.9.2008, 17:51

Цитата(Litkevich Yuriy @ 12.9.2008, 18:39) *
а точнее

QSqlTableModel *sqm_tecushie;
MyWindow::MyWindow(QWidget *parent)
    : QMainWindow(parent)
{
sqm_tecushie = new QSqlTableModel(this,db);
...
connect(sqm_tecushie, SIGNAL( dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) ), this, SLOT(sqm_tecushie_ dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )));
...
}

void MyWindow::sqm_tecushie_dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )){

QMessageBox::critical(0,  "Внимание","Произошло событие dataChanged - пользователь изменил данные.", QMessageBox::Cancel);
}


смотрел исходники класса ... перепробывал все стратегии.. в тч когда отправляется сигнал dataChange
bool QSqlTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    
    case OnFieldChange: {
        ...
    
    case OnRowChange:
      ...
        emit dataChanged(index, index);
       .
    case OnManualSubmit: {
       ...
        emit dataChanged(index, index);
       .
  .
}

Автор: Litkevich Yuriy 12.9.2008, 17:57

замечание первое и главное в функции:
connect у сигналов и слотов нельзя указывать имена параметров, только их тип.

Автор: dzyk 12.9.2008, 18:13

connect(sqm_tecushie, SIGNAL(dataChanged (QModelIndex, QModelIndex ) ), this, SLOT(sqm_tecushie_dataChanged (QModelIndex , QModelIndex )));

не помогло :(

Litkevich Yuriy,
Я ведь такую ошибку давно бы нашел.
Эх, кто бы попробовал отловить сигнал ... :rolleyes:

Автор: Litkevich Yuriy 12.9.2008, 18:15

Цитата(dzyk @ 12.9.2008, 22:13) *
не помогло
а ты неправильно написал, ссылки-то зачем удалил, болжно быть так:
connect(sqm_tecushie, SIGNAL( dataChanged ( const QModelIndex &, const QModelIndex &) ), this, SLOT(sqm_tecushie_ dataChanged ( const QModelIndex &, const QModelIndex &)));

Автор: dzyk 12.9.2008, 18:17

Litkevich Yuriy, я когда код постил - брал из Ассистента, в моих исходниках connect написан верно.

Litkevich Yuriy, и beforeUpdate сигнал класса QSqlTableModel пробовал - :( ничего....

Автор: Litkevich Yuriy 12.9.2008, 18:19

и еще слоты и сигналы удобно отлаживать при наличие консоли. Добавь в файл проекта:
CONFIG += console

Цитата(dzyk @ 12.9.2008, 22:17) *
брал из Ассистента, в моих исходниках connect написан верно.
дай мне ссылку на пример из Асистента

Автор: dzyk 12.9.2008, 18:21

Litkevich Yuriy, может вы сами попробуете ?? ну очень прошу.

Автор: Litkevich Yuriy 12.9.2008, 18:23

выкладывай наипростейший пример в котором есть эта проблема

Автор: dzyk 12.9.2008, 18:25

Litkevich Yuriy,

Цитата(Litkevich Yuriy @ 12.9.2008, 19:19) *
дай мне ссылку на пример из Асистента


qthelp://com.trolltech.qt.440/qdoc/qabstractitemmodel.html#dataChanged

Цитата(Litkevich Yuriy @ 12.9.2008, 19:23) *
выкладывай наипростейший пример в котором есть эта проблема

щас напишу

Автор: Litkevich Yuriy 12.9.2008, 18:36

Цитата(dzyk @ 12.9.2008, 22:25) *
qabstractitemmodel.html#dataChanged
вижу только описание функции, в упор невижу примера в котором в функции connect можно использовать имена параметров/аргументов в сигналах и слотах.

исправь свою функцию connect как я написал

Читай внимательно описание к функции http://crossplatform.ru/documentation/qtdoc4.3/qobject.php#connect

Автор: dzyk 12.9.2008, 19:11

Litkevich Yuriy, Огромное спасибо. Ошибка у меня где то в коде проекта. Написал простой пример и все в нем ОК.

 #include <QtGui>
#include <QtSql>

int main(int argc, char *argv[]) {

    QApplication app(argc, argv);

    QSqlDatabase db;  

    db = QSqlDatabase::addDatabase("QSQLITE", "base_ex.db");
    QString file="base_ex.db";
    db.setDatabaseName(file);
    db.open();
  
     QSqlTableModel *sqm_tecushie;
     sqm_tecushie = new QSqlTableModel(0,db);
     sqm_tecushie->setTable("sample");
     sqm_tecushie->select();
  

     QTableView *view = new QTableView();
     view->setModel(sqm_tecushie);

      
     view->resizeRowsToContents();
     view->resizeColumnsToContents();
     view->show();
    
     QTableView *view2 = new QTableView();
     view2->setModel(sqm_tecushie);
    
     QObject::connect(sqm_tecushie,
     SIGNAL( dataChanged ( const QModelIndex &, const QModelIndex &) ),
     view2,
     SLOT(show()));
    
    

     return app.exec();
}

Автор: void* 12.9.2008, 19:21

dzyk, включи все-таки консоль, т.к. если ошибка в коннекте, то Qt тебе тут же скажет об этом (выведет на консоль)

Автор: dzyk 12.9.2008, 19:30

void*, ОК.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)