LINUX.ORG.RU

мучаем QSortFilterProxyModel - не работает setRelation

 ,


0

1

При использовании модели посредника proxy типа QSortFilterModel перестает работать связь со справочниками.

// при открытии документа делаю
model = new QSqlRelationalTableModel(this);
proxy = new QSortFilterProxyModel(this);
proxy->setSourceModel(model);

// при работе с таблицей
model->setTable("TestTable");
model->setRelation(1, QSqlRelation("Dict1", "id", "name"));
view->setModel(proxy);

Если сделать

view->setModel(model);
то при работе с таблицей TestTable данные нормально берутся из справочника. Если же как в коде
view->setModel(proxy);
то данные из справочника пропадают.

Как подправить этот баг? P.S.

QSortFilterProxyModel *proxy;
QSqlRelationalTableModel *model;
MyView *view; // наследник QTableView

    modelDogovors->select();
    QSortFilterProxyModel *proxy = new QSortFilterProxyModel;
    proxy->setSourceModel(modelDogovors);
    proxy->setFilterFixedString("Ожидается оплата");
    proxy->setFilterKeyColumn(7);
    ui->tableView_dogovors_no->setModel(proxy);

Вот у меня ничего не пропадает...

vladcraft
()
Ответ на: комментарий от vladcraft

Вот у меня ничего не пропадает...

Так и связи со справочниками тоже нет.

у меня, я так думаю вот этот оператор не срабатывает

model->setRelation(1, QSqlRelation("Dict1", "id", "name"));

developer-cpp
() автор топика
Ответ на: комментарий от vladcraft

А как работает? У меня данные правильно отображаюются из справочника, но ... при редактировании не появляется список значений из справочника (а если переставить на model, то все нормально)

developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp

Две tableView, в первой просто вывод из модели, во второй из прокси модели. Реляционная связность, выпадающий список, значение названия полей, всё копируется от первой модели, нормально редактируется.

vladcraft
()
Ответ на: комментарий от vladcraft

Радует, что с прокси и реляционная связность работают вместе. Осталось только найти, что у меня не так )

developer-cpp
() автор топика
Ответ на: комментарий от vladcraft

Посмотрите, что не так в варианте с proxy. Без прокси при редактировании таблицы список с именами из справочника выпадает. С proxy нет.

CREATE TABLE TestDict (    
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(20) NOT NULL
);
CREATE TABLE TestTable (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "dict_id" integer NOT NULL,
    "value" real NOT NULL,
    FOREIGN KEY("dict_id") REFERENCES TestDict
);

INSERT INTO TestDict ("name") VALUES ("first element");
INSERT INTO TestDict ("name") VALUES ("second element");

INSERT INTO TestTable ("dict_id","value") VALUES ("1","22");

первый вариант без прокси

#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[]){
	QApplication app(argc,argv);
	QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
	db.setDatabaseName("test.db");
	if(!db.open()) {
            qDebug() << "open error";
	    return 1;
	}
	QSqlRelationalTableModel model;
	model.setTable("TestTable");
	model.setRelation(model.fieldIndex("dict_id"), QSqlRelation("TestDict", "id", "name"));
	QTableView view;
	view.setModel(&model);
        view.setItemDelegate(new QSqlRelationalDelegate(&view)); 
	view.show();
	model.select();
	return app.exec();
}

второй с proxy - работает некорректно

#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[]){
	QApplication app(argc,argv);
	QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
	db.setDatabaseName("test.db");
	if(!db.open()) {
            qDebug() << "open error";
	    return 1;
	}
	QSqlRelationalTableModel model;
	model.setTable("TestTable");
	model.setRelation(model.fieldIndex("dict_id"), QSqlRelation("TestDict", "id", "name"));
	QTableView view;
	QSortFilterProxyModel proxy;
        proxy.setSourceModel(&model);
	view.setModel(&proxy);
        view.setItemDelegate(new QSqlRelationalDelegate(&view)); 
	view.show();
	model.select();
	return app.exec();
}

cpp.developer

anonymous
()
Ответ на: комментарий от anonymous

попробуй добавь

model.setJoinMode(QSqlRelationalTableModel::LeftJoin);
А так же
view.setModel(&proxy);
поcле select();

и должно вызываться не только model.select(); а ещё proxy.select();

vladcraft
()
Последнее исправление: vladcraft (всего исправлений: 4)
Ответ на: комментарий от vladcraft

Так? Не работает :-(

#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[]){
	QApplication app(argc,argv);
	QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
	db.setDatabaseName("test.db");
	if(!db.open()) {
            qDebug() << "open error";
	    return 1;
	}
	QSqlRelationalTableModel model;
	model.setTable("TestTable");
	model.setRelation(model.fieldIndex("dict_id"), QSqlRelation("TestDict", "id", "name"));
	QTableView view;
	QSortFilterProxyModel proxy;
        proxy.setSourceModel(&model);
        view.setItemDelegate(new QSqlRelationalDelegate(&view)); 
	view.show();
	model.select();
	model.setJoinMode(QSqlRelationalTableModel::LeftJoin);
	view.setModel(&proxy);
	return app.exec();
}

и должно вызываться не model.select(); а proxy.select();

main.cpp:21:8: error: ‘class QSortFilterProxyModel’ has no member named ‘select’
developer-cpp
() автор топика
Ответ на: комментарий от developer-cpp
	QSqlRelationalTableModel model;
	model.setTable("TestTable");
	model.setRelation(model.fieldIndex("dict_id"), QSqlRelation("TestDict", "id", "name"));
        model.setJoinMode(QSqlRelationalTableModel::LeftJoin);
	model.select();
	QTableView view;
	view.show();
	QSortFilterProxyModel proxy;
        proxy.setSourceModel(&model);
        view.setItemDelegate(new QSqlRelationalDelegate(&view)); 
	view.setModel(&proxy);
	return app.exec();

а так?

vladcraft
()
Ответ на: комментарий от developer-cpp

И ещё у меня вот так объявляются модели:

modelDopSogl = new QSqlRelationalTableModel(this, db);
то есть наследуется и от db

попробуй QSqlRelationalTableModel model(this, db);

Если не поможешь... тогда курить мануалы... мне тоже вот интересно что за ошибка...

vladcraft
()
Последнее исправление: vladcraft (всего исправлений: 2)
Ответ на: комментарий от developer-cpp

... мне тоже вот интересно что за ошибка...

если в Linux можно увидеть так:

1. скопировать команды SQL и сохранить в файл, например, command.txt

2. cat ./command.sql | sqlite3 test.db

3. скопировать Qt код и собрать

CREATE TABLE TestDict (    
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(20) NOT NULL
);
CREATE TABLE TestTable (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "dict_id" integer NOT NULL,
    "value" real NOT NULL,
    FOREIGN KEY("dict_id") REFERENCES TestDict
);

INSERT INTO TestDict ("name") VALUES ("first element");
INSERT INTO TestDict ("name") VALUES ("second element");
#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[]){
  QApplication app(argc,argv);
  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
  db.setDatabaseName("test.db");
  if(!db.open()) {
            qDebug() << "open error";
	    return 1;
  }
  QTableView view;
  QSqlRelationalTableModel model(&view,db);
  model.setTable("TestTable");
  model.setRelation(model.fieldIndex("dict_id"), QSqlRelation("TestDict", "id", "name"));
  model.setJoinMode(QSqlRelationalTableModel::LeftJoin);
  model.select();
  view.show();
  QSortFilterProxyModel proxy;
  proxy.setSourceModel(&model);
  view.setItemDelegate(new QSqlRelationalDelegate(&view)); 
  view.setModel(&proxy);
  return app.exec();
}

P.S. версия Qt 4.8.2

developer-cpp
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.