Вообщем, хочу сделать так, чтобы TableModel после изменения одной из ячеек строке в 100ой, например - виджет снова вернулся на 100ую строку, которую редактировал пользователь. Для этого хочу отловить событие
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight ) [signal]
.. и ничего не получается
сигнал принимает объект главного окна... отлично обрабатываются события от QAbstractItemView.
А вот QSqlTableModel и QAbstractItemModel ну никак ... помогите.!
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);
}
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);
.
.
}
замечание первое и главное в функции:
connect у сигналов и слотов нельзя указывать имена параметров, только их тип.
connect(sqm_tecushie, SIGNAL(dataChanged (QModelIndex, QModelIndex ) ), this, SLOT(sqm_tecushie_dataChanged (QModelIndex , QModelIndex )));
не помогло
Litkevich Yuriy,
Я ведь такую ошибку давно бы нашел.
Эх, кто бы попробовал отловить сигнал ...
Litkevich Yuriy, я когда код постил - брал из Ассистента, в моих исходниках connect написан верно.
Litkevich Yuriy, и beforeUpdate сигнал класса QSqlTableModel пробовал - ничего....
и еще слоты и сигналы удобно отлаживать при наличие консоли. Добавь в файл проекта:
CONFIG += console
Litkevich Yuriy, может вы сами попробуете ?? ну очень прошу.
выкладывай наипростейший пример в котором есть эта проблема
Litkevich Yuriy,
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();
}
dzyk, включи все-таки консоль, т.к. если ошибка в коннекте, то Qt тебе тут же скажет об этом (выведет на консоль)
void*, ОК.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)