crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> изменения данных в QTableView и установка setWindowModified(true);
rrmini
  опции профиля:
сообщение 3.2.2010, 11:28
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 41
Регистрация: 23.11.2009
Пользователь №: 1251

Спасибо сказали: 0 раз(а)




Репутация:   0  


Имеется связка model - view:

CODE
QSqlTableModel *model = new QSqlTableModel(0);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
.....
QTableView *view = new QTableView(0);
view-> setModel(model);
view-> setWindowTitle(trUtf8("Таблица[*]"));
view-> setWindowModified(false);
....


Задача:
1. При изменении пользователем данных в ячейках( одной ячейки) таблицы или при добавлении(удалении) строки установить view->setWindowModified(true);
2. После сохранения изменений if(model->submitAll()) view->setWindowModified(false);

Я так понимаю при уловии задачи 1 должен генериться какой-то сигнал. который можно отловить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.2.2010, 12:03
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rrmini @ 3.2.2010, 14:28) *
Я так понимаю при уловии задачи 1 должен генериться какой-то сигнал. который можно отловить?
Да, если стратегия OnManualSubmit, то можно использовать сигнал модели dataChanged
Например:
connect(model,SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)),
            this, SLOT(SlotChange()));


Цитата(rrmini @ 3.2.2010, 14:28) *
view->setWindowModified(true)
только вот это не понятно, ты хочешь представление сделать окном верхнего уровня? Тогда тебе прийдётся его удалять вручную либо устанавливать атрибут Qt::WA_DeleteOnClose
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rrmini
  опции профиля:
сообщение 3.2.2010, 12:46
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 41
Регистрация: 23.11.2009
Пользователь №: 1251

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, чудно работает!

Цитата
только вот это не понятно, ты хочешь представление сделать окном верхнего уровня? Тогда тебе прийдётся его удалять вручную либо устанавливать атрибут Qt::WA_DeleteOnClose


У меня две таблицы :
1. "Документы" : id , дата, клиент, водитель-машина;
2. "Маршруты" : id, document_id, маршрут, ед_изм(км или час), количество, сумма;

В одном документе может быть несколько маршрутов.
Для ввода записей в эти таблицы я делаю диалоговое окно в котором есть

mapper = new QDataWidgetMapper(this);
mapper->setModel(docModel); // для сязи с таблицей "Документы"

и есть, описанная в начале темы таблица для ввода маршрутов.

model = new QSqlRelationalTableModel; // для связи с таблицей "Маршруты"
model->setFilter(QString("documentid = %1").arg(docNumber)); // отображаю маршруты только данного документа
ui->tableView->setModel(model); // пользовался дизайнером

для вызова диалога я создаю объект:

OrderFormDialog dialog(documentModel, docNumber, this);
dialog.exec();

При закрытии диалога я так понимаю объект dialog удаляется ? поправьте , если я ошибаюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.2.2010, 13:35
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rrmini @ 3.2.2010, 15:46) *
OrderFormDialog dialog(documentModel, docNumber, this);
dialog.exec();

При закрытии диалога я так понимаю объект dialog удаляется ? поправьте , если я ошибаюсь.
Т.к. ты создаёшь диалог на стеке (как обычную переменную, а не через оператор new), то объект будет удалён по выходу из области видимости (например по выходу из функции в которой он создан)

однако из приведённого кода я не вижу где создаётся представление. В первом сообщении оно создавалось так:
Цитата(rrmini @ 3.2.2010, 14:28) *
QTableView *view = new QTableView(0);
т.е. указатель на родителя обнулён, значит виджет не имеет родителя и является окном верхнего уровня. Такое окно (без родителя) никто удалять автоматически не будет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rrmini
  опции профиля:
сообщение 3.2.2010, 14:50
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 41
Регистрация: 23.11.2009
Пользователь №: 1251

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
однако из приведённого кода я не вижу где создаётся представление. В первом сообщении оно создавалось так:


Япривел данный код , что бы в принципе понять как отловить изменения в таблице.
connect(model,SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)),
this, SLOT(SlotChange())); решает эту задачу вполне.

В моем конкретном случае я создал класс формы Qt Designer (пользуюсь Qt Creator). В дизайнере в форму накидал необходимые комбобоксы и tableView. Поэтому на вопрос, как создается представление, ответить не могу. Не понимаю сам.
В заголовочном файле присутствует:
CODE
#include <QDialog>
#include "ui_orderformdialog.h"
....
namespace Ui {
class OrderFormDialog;
}
class OrderFormDialog : public QDialog {
Q_OBJECT
public:
OrderFormDialog(QSqlRelationalTableModel *,
int, QWidget *parent = 0);
~OrderFormDialog();

QDataWidgetMapper *mapper;
Ui::OrderFormDialog *ui;

в исходнике следующее:
CODE
#include <QDataWidgetMapper>
#include <QMessageBox>
#include <QtSql>

#include "orderformdialog.h"
#include "ui_orderformdialog.h"
#include "delegates/doublespinboxdelegate.h"

OrderFormDialog::OrderFormDialog(QSqlRelationalTableModel *docM,
int docNumber ,QWidget *parent) :
QDialog(parent),
ui(new Ui::OrderFormDialog)
{
ui->setupUi(this);

this->docM = docM;
this->docNumber = docNumber;
ui->docNumberLabel->setText(trUtf8("Документ № %1").arg(docNumber));

createModels();

mapper = new QDataWidgetMapper(this);
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
mapper->setModel(docM);
mapper->setItemDelegate(new QSqlRelationalDelegate(this));
mapper->addMapping(ui->registrationDateEdit, 1);
mapper->addMapping(ui->executionDateEdit, 2);
mapper->addMapping(ui->clientComboBox, 3);
mapper->addMapping(ui->driverComboBox, 4);
mapper->addMapping(ui->truckComboBox, 5);

ui->tableView->setModel(model);
for (int i =0; i < 2; i++){
ui->tableView->setColumnHidden(i , true);
}
ui->tableView->setItemDelegate(new QSqlRelationalDelegate(this));
for (int i = 4; i < 8; i++){
ui->tableView->setItemDelegateForColumn(i, new DoubleSpinBoxDelegate);
}
ui->tableView->resizeColumnsToContents();
ui->tableView->resizeRowsToContents();
ui->tableView->horizontalHeader()->setStretchLastSection(true);

setWindowModified(false);
setWindowTitle(trUtf8("Заказ[*]"));

createConnects();
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.2.2010, 15:44
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rrmini @ 3.2.2010, 17:50) *
ui->setupUi(this);
вот тут и создаются объекты из формы дизайнера.

Цитата(rrmini @ 3.2.2010, 17:50) *
В дизайнере в форму накидал необходимые комбобоксы и tableView. Поэтому на вопрос, как создается представление, ответить не могу. Не понимаю сам.
в дизайнере в меню "Форма" есть пункт "показать код" он покажет тебе код который сгенерит uic во время компиляции проекта
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rrmini
  опции профиля:
сообщение 3.2.2010, 16:13
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 41
Регистрация: 23.11.2009
Пользователь №: 1251

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 3.2.2010, 15:44) *
в дизайнере в меню "Форма" есть пункт "показать код" он покажет тебе код который сгенерит uic во время компиляции проекта

посмотрел , там следующее :
tableView = new QTableView(layoutWidget);

Но как я думаю, при закрытии диалога объект dialog удаляется, а вместе с ним и tableView. Соответственно нет необходимости в атрибуте Qt::WA_DeleteOnClose
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 3.2.2010, 17:02
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(rrmini @ 3.2.2010, 19:13) *
посмотрел , там следующее :
tableView = new QTableView(layoutWidget);
Родителем tableView будет виджет layoutWidget, или, если это компоновщик, то виджет на котором лежит этот компоновщик

Цитата(rrmini @ 3.2.2010, 19:13) *
Но как я думаю, при закрытии диалога объект dialog удаляется, а вместе с ним и tableView. Соответственно нет необходимости в атрибуте Qt::WA_DeleteOnClose
совершенно верно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


14 чел. читают эту тему (гостей: 14, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.1.2025, 8:13