Russian Qt Forum
Октябрь 01, 2024, 22:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QComboBox, его внутренняя модель и QDataWidgetMapper  (Прочитано 5632 раз)
ranet
Гость
« : Октябрь 07, 2009, 15:08 »

Пытаюсь найти по форуму, как правильно привинчивать ComboBox к таблице.. захотелось как-то систематизировать найденное, чтобы его можно было использовать:)

Как я понял, у  QComboBox'а есть своя внутренняя модель. И её можно заменить на другую, связанную с таблицей.. Но можно и заполнить QComboBox вручную:
Код:
void SitesDialog::CB_load()
{
    QSqlQuery qq;
    qq.exec("SELECT  name   from towns");
    qq.first();

    while (qq.next())
    {
        sitdial_ui.town_CB->addItem(qq.value(0).toString());
    }
}

А вот как его правильно привинтить к таблице, чтобы сработало?
просто
Код:
mapp->addMapping(sitdial_ui.town_CB, 1);
не срабатывает, хотя с lineEdit работает.. Наверное нужно подумать на счет делегата.. То есть его видимо нужно сначала сконструировать, а потом применить..

Записан
CroCIV
Гость
« Ответ #1 : Октябрь 08, 2009, 07:43 »

Пытаюсь найти по форуму, как правильно привинчивать ComboBox к таблице.. захотелось как-то систематизировать найденное, чтобы его можно было использовать:)

Как я понял, у  QComboBox'а есть своя внутренняя модель. И её можно заменить на другую, связанную с таблицей.. Но можно и заполнить QComboBox вручную:
Код:
void SitesDialog::CB_load()
{
    QSqlQuery qq;
    qq.exec("SELECT  name   from towns");
    qq.first();

    while (qq.next())
    {
        sitdial_ui.town_CB->addItem(qq.value(0).toString());
    }
}

А вот как его правильно привинтить к таблице, чтобы сработало?
просто
Код:
mapp->addMapping(sitdial_ui.town_CB, 1);
не срабатывает, хотя с lineEdit работает.. Наверное нужно подумать на счет делегата.. То есть его видимо нужно сначала сконструировать, а потом применить..




 
я бы написал так sitdial_ui.town_CB->setModel(qq), а qq обьявил бы не в функции CB_load(), а в классе SitesDialog, чтоб жил подольше  Подмигивающий
Записан
ranet
Гость
« Ответ #2 : Октябрь 08, 2009, 08:50 »

...
я бы написал так sitdial_ui.town_CB->setModel(qq), а qq обьявил бы не в функции CB_load(), а в классе SitesDialog, чтоб жил подольше  Подмигивающий
За  sitdial_ui.town_CB->setModel(qq) - спасибо, мне в голову только вариант с циклом пришел! Он тоже работает, ComboBox заполняется элементиками, все нормально. Но я уткнулся в другое: дальше этот  ComboBox хочется привинтить к другой таблице, не к той из которой он заполнялся. Попытка сделать это аналогично привинчиванию lineEdit не проходит, найти ответ в описании QComboBox - пока не нашел.. google делает смутные намеки, что нужно наверное делегата создавать.. Как и все тунеядцы, я инстинктивно пытаюсь уклониться Смеющийся, но похоже придется..
Записан
CroCIV
Гость
« Ответ #3 : Октябрь 08, 2009, 09:17 »

Но я уткнулся в другое: дальше этот  ComboBox хочется привинтить к другой таблице, не к той из которой он заполнялся. Попытка сделать это аналогично привинчиванию lineEdit не проходит, найти ответ в описании QComboBox - пока не нашел.. google делает смутные намеки, что нужно наверное делегата создавать.. Как и все тунеядцы, я инстинктивно пытаюсь уклониться Смеющийся, но похоже придется..

QDataWidgetMapper, на сколько я догадываюсь, создан для синхронизации с моделью не модельных виджетов, т.е. виджетов у которых нет своей модели. КуКомбоБокс ты можешь с QDataWidgetMapper  заюзать к примеру так

Код:
	
map = new QDataWidgetMapper();
map->setModel(sqlRn);
map->addMapping(ui.spinBox, 1);
map->addMapping(ui.lineEdit, 0);
map->toLast();

ui.comboBox->setModel(map->model());
ui.comboBox->setModelColumn(0);
ui.comboBox->setCurrentIndex(map->currentIndex());


или у комбика есть еще свой лайн едит, заюзат который можно так

Код:
	
map = new QDataWidgetMapper();
map->setModel(sqlRn);
map->addMapping(ui.spinBox, 1);
map->addMapping(ui.lineEdit, 0);
map->addMapping(ui.comboBox->lineEdit(), 0);
map->toLast();

Кароче, рекомендуют вначале книжку по теме прочитать, примеры посмотреть и руководства и уже после этого начать решать задачи  Подмигивающий удачи
Записан
ranet
Гость
« Ответ #4 : Октябрь 08, 2009, 09:31 »

Можно намного проще:
нашел:
 если для QlineEdit достаточно так написать:
Код:
my_mapper->addMapping(sitdial_ui.name_LE,3);

то у QComboBox все сложнее Показает язык, там еще один параметр нужно указывать:
Код:
my_mapper->addMapping(sitdial_ui.town_CB, 1, "currentText");
Кстати, в моей книжке "QT 4: программирование GUI на С++"  формат команды для ComboBox приведен именно в таком виде,
то есть там так и написано:
Код:
mapper->addmapping(departamentComboBox, Employee_DepartamentId)
то есть без третьего параметра. Походу книга косячная.. А на этом нужно обязательно акцентировать внимание, вопрос даже одной копейки не стоит - просто синтаксис неверно приведен.. Никто даже и не думает, что тут трудности какие-то будут, сильно удивляется, и теряет время (я два дня потерял Плачущий)
Записан
ranet
Гость
« Ответ #5 : Октябрь 08, 2009, 09:37 »


или у комбика есть еще свой лайн едит, заюзат который можно так

Код:
	
map = new QDataWidgetMapper();
map->setModel(sqlRn);
map->addMapping(ui.spinBox, 1);
map->addMapping(ui.lineEdit, 0);
map->addMapping(ui.comboBox->lineEdit(), 0);
map->toLast();

Кароче, рекомендуют вначале книжку по теме прочитать, примеры посмотреть и руководства и уже после этого начать решать задачи  Подмигивающий удачи
За наводку на наличие у комбика lineEdit'а - отдельное СПАСИБО!!!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.086 секунд. Запросов: 20.