Portál AbcLinuxu, 10. května 2025 01:26

Dotaz: QT+SQL+C++

7.11.2009 20:01 Jirka
QT+SQL+C++
Přečteno: 444×
Odpovědět | Admin
Ahoj, mám problém, snažím se pracovat v QT s DB. Mějme 2 tabulky:

firma{ nazev; id; }

zamestnanec { jmeno; prijmeni; podrobnosti; firma; }

Chci namapovat firmu na combobox čímž, se mi v druhém komboboxu vyberou zaměsnanci té dané firmy. Výberem zaměstnance z druhého comboboxu se mi o něm zobrazí podrobnosti. Pokoušel jsem se to dělat pomocí QSqlRelationalTableModel a mapperů. Ale zatím se mi to nepovedlo. Mohl by mě prosím někdo nasměrovat?
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.11.2009 22:10 Roman Došek | skóre: 17 | blog: flare
Rozbalit Rozbalit vše Re: QT+SQL+C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nejdřív si vytvoříš nějakou funkci, která ti při zobrazení dialogu naplní první combobox, něco jako:
void Dialog::NacteniFirem()
{
    QSqlQuery query("SELECT nazev FROM firma");
    while( query.next()) {
        ui->combobox->addItem(query.value(0).toString(),query.value(0));
    }
    query.finish();
}
Potom si vytvoříš pro 1. combobox funkci pro signál currentIndexChanged, ve kterém vyčistíš obsah 2. comboboxu a načteš do něj 2.SQL dotazem seznam zaměstanců.
void MainWindow::on_combobox_currentIndexChanged(QString Text)
{
    ui->combobox2->clear();
        QSqlQuery query;
        query.prepare("SELECT id,jmeno,prijmeni FROM zamestnanci WHERE firma = ?");
        query.bindValue(0, ui->combobox->currentText());
        query.exec();
        while( query.next()) {
            ui->combobox2->addItem(query.value(0).toString(),query.value(0));
        }
        query.finish();
}
Snad jsem nenapsal nějakej blud, už jsem v Qt chvilku nic nedělal. Kdyžtak sem hoď nějakej kód co už máš, na tom bych ti měl být schopen lépe pomoci. Jinak doporučuju používat Qt Creator :)
8.11.2009 10:51 Jirka
Rozbalit Rozbalit vše Re: QT+SQL+C++
Tvůj způsob je mi jasný, takto jsem to, ale chtěl dělat pouze v případě, že by to nešlo způsobem, který jsem naznačil níže.
8.11.2009 10:49 Jirka
Rozbalit Rozbalit vše Re: QT+SQL+C++
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jak jsem to zatím dělal já:
	model = new QSqlRelationalTableModel(this);
	model->setEditStrategy(QSqlTableModel::OnManualSubmit);
	model->setTable("firma");
	
	typeIndex = model->fieldIndex("id_adresa");
	
	model->setRelation(typeIndex, QSqlRelation("adresa", "id_adresa", "ulice"));
	model->select();
	
	ui.comboBoxFirmaNazev->setModel(model);	//Mapovani sloupcu tabulek na bunky GUI
	ui.comboBoxFirmaNazev->setModelColumn(model->fieldIndex("nazev"));
	
	mapper = new QDataWidgetMapper(this);
	mapper->setModel(model);
	mapper->setItemDelegate(new QSqlRelationalDelegate(this));

	mapper->addMapping(ui.lineEditFirmaNazev, model->fieldIndex("nazev"));
	mapper->addMapping(ui.lineEditFirmaICO, model->fieldIndex("ico"));
	mapper->addMapping(ui.lineEditFirmaDIC, model->fieldIndex("dic"));

	mapper->addMapping(ui.lineEditFirmaUlice, relationModel->fieldIndex("ulice"));
	mapper->addMapping(ui.lineEditFirmaPSC, relationModel->fieldIndex("psc"));
	mapper->addMapping(ui.lineEditFirmaCP, relationModel->fieldIndex("cislo_popisne"));
Není to sice příklad, který jsem popsal, tady se snažím spojit tabulku firma s tabulkou adresa (tzn relace 1:1), ale problém je stejný, protože model->setRelation nahradí sloupec id_adresa v modelu sloupcem ulice v relaci. Nepodařilo se mi spojit celé tabulky.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.