изменения данных в QTableView и установка setWindowModified(true); |
Здравствуйте, гость ( Вход | Регистрация )
изменения данных в 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 |
Я так понимаю при уловии задачи 1 должен генериться какой-то сигнал. который можно отловить? Да, если стратегия OnManualSubmit, то можно использовать сигнал модели dataChangedНапример:
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 |
OrderFormDialog dialog(documentModel, docNumber, this); Т.к. ты создаёшь диалог на стеке (как обычную переменную, а не через оператор new), то объект будет удалён по выходу из области видимости (например по выходу из функции в которой он создан)dialog.exec(); При закрытии диалога я так понимаю объект dialog удаляется ? поправьте , если я ошибаюсь. однако из приведённого кода я не вижу где создаётся представление. В первом сообщении оно создавалось так: 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 |
ui->setupUi(this); вот тут и создаются объекты из формы дизайнера.В дизайнере в форму накидал необходимые комбобоксы и tableView. Поэтому на вопрос, как создается представление, ответить не могу. Не понимаю сам. в дизайнере в меню "Форма" есть пункт "показать код" он покажет тебе код который сгенерит uic во время компиляции проекта
|
|
|
rrmini |
3.2.2010, 16:13
Сообщение
#7
|
Студент Группа: Участник Сообщений: 41 Регистрация: 23.11.2009 Пользователь №: 1251 Спасибо сказали: 0 раз(а) Репутация: 0 |
в дизайнере в меню "Форма" есть пункт "показать код" он покажет тебе код который сгенерит 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 |
посмотрел , там следующее : Родителем tableView будет виджет layoutWidget, или, если это компоновщик, то виджет на котором лежит этот компоновщикtableView = new QTableView(layoutWidget); Но как я думаю, при закрытии диалога объект dialog удаляется, а вместе с ним и tableView. Соответственно нет необходимости в атрибуте Qt::WA_DeleteOnClose совершенно верно
|
|
|
Текстовая версия | Сейчас: 22.1.2025, 7:52 |