Russian Qt Forum

Qt => Базы данных => Тема начата: mwChief от Март 14, 2010, 15:55



Название: QSqlRelationalTableModel и QComboBox
Отправлено: mwChief от Март 14, 2010, 15:55
Есть база следующего вида:

(http://lh4.ggpht.com/_bFkLbDSEg-g/S5wi58xQd5I/AAAAAAAAA_I/eKgiKq6BjYo/s800/tables.jpg)

Гружу table1 в  QSqlRelationalTableModel и назначаю ее tableView. Устанавливаю отношение между таблицами чтоб в table2_id показывался не id а имя поля которое ему соотвествует во второй таблице.

Код
C++ (Qt)
model->setRelation(model->fieldIndex("table2_id"),
QSqlRelation("table2","table2_id","table2_text"));
                        
Мне нужно отображать поле table2_id в comboBox, чтоб значение в comboBox всегда соотвествовало строке выделенной в tableView. И при смене значения в comboBox это изменение сохранялось в выделенной в tableView строке.
С отображением проблем не возникло - просто назначил comboBox модель:

Код
C++ (Qt)
comboBox->setModel(model);
comboBox->setModelColumn(model->fieldIndex("table2_id"));
   
Но вот как сохранить изменения при выборе другого значения в comboBox незнаю.

Форма выглядит примерно вот так:

(http://lh3.ggpht.com/_bFkLbDSEg-g/S5wimhbgUXI/AAAAAAAAA-s/2Qe4QsBv2Fg/s800/dialog.jpg)


Пример не совсем реальный, я просто попытался выделить из программы ту часть с которой у меня возникли трудности.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: VAP от Март 14, 2010, 20:49
Думаю поможет QDataWidgetMapper...


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: mwChief от Март 14, 2010, 21:00
Я тоже так думал, но все мои поиски привели к многочисленным жалобам (в том числе в багтрекере у тролей) на то что QDataWidgetMapper с QCombobox не работает.
Например вот:
http://bugreports.qt.nokia.com/browse/QTBUG-158?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

может я неправильно понял, даже был бы рад если это так


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: VAP от Март 14, 2010, 23:43
Судя по приведенной ссылке бага касается версии 4.2.0. Лично я юзал на 4.5.0 так проблем нет.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: mwChief от Март 14, 2010, 23:46
Что именно и как вы использовали? Можна кусочек кода?

Там не указано в какой версии это исправлено, так что бага вполне еще может быть актуальной.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: VAP от Март 14, 2010, 23:55
Загляни в Ассистент, там есть примеры кода по теме


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: mwChief от Март 15, 2010, 00:07
Давайте определимся.
Вы написали
Цитировать
Судя по приведенной ссылке бага касается версии 4.2.0. Лично я юзал на 4.5.0 так проблем нет.
Вы использовали QDataWidgetMapper с QComboBox? Если да, то покажите пожалйста кусочек кода с этим использованием. Если по каким-то причинам вы не можете или не хотите показывать код, так и скажите.

Цитировать
Загляни в Ассистент, там есть примеры кода по теме
Воистину универсальный ответ который можна постить в любую тему форума. О каких примерах кода вы говорите, снова таки об использовании QDataWidgetMapper и QComboBox? Если вы точно знаете что это есть, будьте добры, подскажите как искать.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: VAP от Март 15, 2010, 21:51
Советую ознакомиться:
http://doc.trolltech.com/qq/qq21-datawidgetmapper.html#usingdelegatestoofferchoices


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: mwChief от Март 16, 2010, 00:12
Спасибо, похоже это как раз то что нужно. Но я никак немогу заставить его работать.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: mwChief от Март 19, 2010, 00:04
Проблему решил


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 20, 2010, 18:35
У меня немного другая ситуация:
Table2 редактируется в диалоге в QTableView, QSqlRelationalTableModel ... но после закрытия диалога в главной форме не получяется обновить содержимое кобобоксов.  (скреен будет чуть позже)


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: Dr.Vlad от Апрель 21, 2010, 01:49
QTableView имеет свойство устанавливать setCurrentIndex(index).
В тексте:

В строку добавляете значение из comboBox,

QString jj = dobavit->m_ui->comboBox->currentText().trimmed();

Производите поиск по строке на совпадение,

QSortFilterProxyModel proxy;
                proxy.setSourceModel(model());
                proxy.setFilterKeyColumn(0);
                proxy.setFilterRegExp("^"+ jj +"$");
                if (proxy.rowCount() != 0)
                {
                    QModelIndex indeX = proxy.mapToSource(proxy.index(0, 0, QModelIndex()));
                    m_ui->tableView->setCurrentIndex(indeX);
                }

Устанавливаете текущий индекс.
Для comboBox специально создаётся текущая модель с запросом.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 21, 2010, 16:09
Признаю вопрос был неправильно задан :) забыл сказать что кобобокс на QTableView и следовательно мне нужно обновить весь QTableView ... (Скрины ниже)
Я добавил новую линию в Table2 ... закрыл диалог ... перехожу на главную форуму (Table1) ... пытаюсь найти айтем TEST!!! ... его нету.

Заранее благодарен!


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: Dr.Vlad от Апрель 23, 2010, 18:27
А зачем Вам QComboBox на QTableView? Впервые вижу comboBox в таблице!
Помогу!


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: alexman от Апрель 23, 2010, 20:44
А зачем Вам QComboBox на QTableView? Впервые вижу comboBox в таблице!
Помогу!
Нормальный способ для выбора одного элемента из множества!?


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: Dr.Vlad от Апрель 23, 2010, 23:26
Предположим, что это фантазия автора. Где он сами записи хранит? если в comboBox это одно, если в базе, то совсем другое.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: alexman от Апрель 24, 2010, 07:08
Какая разница где хранит? Переопределяй QItemDelegate и показывай любые виджеты. Ну а данные для кобо блкса из модели берем!


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 25, 2010, 22:15
Если итнересно я могу выложить пожект ... с кодом пере глазами думаю всем будет монятнее что и как задумано


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 25, 2010, 22:17
Какая разница где хранит? Переопределяй QItemDelegate и показывай любые виджеты. Ну а данные для кобо блкса из модели берем!

а как модель обновить?


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: alexman от Апрель 26, 2010, 07:53
Какая разница где хранит? Переопределяй QItemDelegate и показывай любые виджеты. Ну а данные для кобо блкса из модели берем!
а как модель обновить?
Код:
bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )
void QAbstractItemModel::reset ()
Еще могут пригодиться
Код:
void QAbstractItemModel::layoutChanged ()
void QAbstractItemModel::dataChanged ( const QModelIndex & topLeft, const QModelIndex & bottomRight )


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 26, 2010, 12:42
Понять что с QSqlRelationalTableModel у меня не выйдет обновить занченя? ... переделать в QSqlTableModel?


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: crossly от Апрель 26, 2010, 14:01
почему не выйдет?? submit().... select()


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 26, 2010, 14:12
почему не выйдет?? submit().... select()

Так я открываю диалог для редактирования ТАБЛИЦЫ2:
Код:
void FamilyBudget::openArticleForm()
{
    ArticleWindow form1(this);
    form1.resize(400, 300);
    form1.exec();    
    updateLinesPanel();
}

После того как я закончил работать с диалогом я закрываю и срабатывает updateLinesPanel();

Код:
void FamilyBudget::updateLinesPanel()
{
    linesModel->submit();
    linesModel->select();
    linesView->setModel(linesModel);
}

И все равно выбрать только что добавлене значения не могу ...


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: crossly от Апрель 26, 2010, 15:08
а если обновить ещё и связанную модель??


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 26, 2010, 15:16
если я правильно понял я обновил так:

Код:
void ArticleWindow::done(int result)
{
    articleModel->submit();
    articleModel->select();
    //articleView->setModel(articleModel);
    QDialog::done(result);
}

срабатывает когда закрываю диалог ... но толку 0


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 26, 2010, 15:17
я на связи и всегда жду свежих идей ... если нужно могу прожек выложить!


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: crossly от Апрель 26, 2010, 16:44
а если добавить
Код:
articleModel->relationModel(int column)->select();


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: vpara от Апрель 26, 2010, 16:50
а если добавить
Код:
articleModel->relationModel(int column)->select();

УРААААААААААААААААААААААААА!!!!!!!!!!!!! получилось ... Огромное вам человеческое спасибо!  :)

только я сделал
Код:
linesModel->relationModel(2)->select();
так как linesModel u menea na glavnoi forme .... Спасибо!


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: DrHaos от Октябрь 11, 2010, 23:35
У меня ситуация схожая, открываю для редактирования строку главной таблицы (все поля таблицы привязаны к виджетам на форме через QDataWidgetMapper) затем добавляю в связанную таблицу строку, в QComboBox изменения отображаются а в гланой таблице сохранить не  могу, как обновить индексы?
 
Код:
void MMalc::editAgreement()
{
stackedWidget->setCurrentIndex(1);
    QModelIndex index = tableViewMagazine->currentIndex();
    if (!index.isValid())
        return;
mapper->setCurrentIndex(index.row());
}

<....>


void MMalc::addDepartment()
{
if (stackedDepart->currentIndex()) {
stackedDepart->setCurrentIndex(0);
buttonAddDepar->setText(tr("Save"));
buttonSave->setEnabled(FALSE);
int row = departmentModel->rowCount();
departmentModel->insertRow(row);
mapperDep->setCurrentIndex(row);
lineEditDepartment->setFocus();
} else {
stackedDepart->setCurrentIndex(1);
buttonAddDepar->setText(tr("Add"));
buttonSave->setEnabled(TRUE);
mapperDep->submit();
int row = departmentModel->rowCount();
comboBoxDepartment->setCurrentIndex(--row);
}
}



Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: crossly от Октябрь 12, 2010, 11:42
так же как указано выше...


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: DrHaos от Октябрь 12, 2010, 13:29
Да вот пробовал что то не получается. может подскажите в какое место воткнуть все это дело.


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: crossly от Октябрь 13, 2010, 14:48
после сабмита маперу...


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: RVZ от Октябрь 20, 2010, 18:21
Всем здравия!!!
------------------------------------------------------
Тихий ужос что то с QComboBox одни проблемы ну ни как он не хочет у меня работать
В общем в таблице есть поле с одним символом (вариантов значения всего 3 :"Н";"X";"Y")
Делать связь с внешним ключом нет смысла 1байт всего поэтому варианты значений ввел с клавы по двойному клику на комбике в креаторе

Код:
..........
QDataWidgetMapper *mapper = new QDataWidgetMapper();
mapper->setItemDelegate(new QSqlRelationalDelegate());
..........
mapper->addMapping(ui->Zx,4);
//Zx - Комбик , 4 - номер столбца с символом
..........
При загрузки формы(рысканье по заранее созданным записям для тестирования) значения нормально разбрасываются по виджетам в том числе и злополучный символ(то есть если в таблице Н то и в виджет помещается Н если в таблице Y то и в виджете тоже)
но вот если символ поменять то после SubmitAll() он в таблице не изменяется и в самом виджете становится как был ранее(то есть как в таблице)
Что делать кто сталкивался подскажите ???


Название: Re: QSqlRelationalTableModel и QComboBox
Отправлено: crossly от Октябрь 20, 2010, 22:59
ну вообще то relationaldelegate предназначен именно для связи двух таблиц... если вам нужен просто выбор значения сделайте свой делегат..