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

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

сигнал принимает объект главного окна... отлично обрабатываются события от QAbstractItemView.
А вот QSqlTableModel и QAbstractItemModel ну никак ... помогите.!
Litkevich Yuriy
Цитата(dzyk @ 12.9.2008, 19:35) *
и ничего не получается
Цитата(dzyk @ 12.9.2008, 19:35) *
ну никак
а точнее
dzyk
Цитата(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
замечание первое и главное в функции:
connect у сигналов и слотов нельзя указывать имена параметров, только их тип.
dzyk
connect(sqm_tecushie, SIGNAL(dataChanged (QModelIndex, QModelIndex ) ), this, SLOT(sqm_tecushie_dataChanged (QModelIndex , QModelIndex )));

не помогло :(

Litkevich Yuriy,
Я ведь такую ошибку давно бы нашел.
Эх, кто бы попробовал отловить сигнал ... :rolleyes:
Litkevich Yuriy
Цитата(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
Litkevich Yuriy, я когда код постил - брал из Ассистента, в моих исходниках connect написан верно.

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

Цитата(dzyk @ 12.9.2008, 22:17) *
брал из Ассистента, в моих исходниках connect написан верно.
дай мне ссылку на пример из Асистента
dzyk
Litkevich Yuriy, может вы сами попробуете ?? ну очень прошу.
Litkevich Yuriy
выкладывай наипростейший пример в котором есть эта проблема
dzyk
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
Цитата(dzyk @ 12.9.2008, 22:25) *
qabstractitemmodel.html#dataChanged
вижу только описание функции, в упор невижу примера в котором в функции connect можно использовать имена параметров/аргументов в сигналах и слотах.

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

Читай внимательно описание к функции connect
dzyk
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*
dzyk, включи все-таки консоль, т.к. если ошибка в коннекте, то Qt тебе тут же скажет об этом (выведет на консоль)
dzyk
void*, ОК.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.