[C++/Qt] Rij toevoegen in QTableView

Pagina: 1
Acties:

Onderwerpen


  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 11:11
Ik probeer een applicatie te maken om de tijd bij te houden die ik aan bepaalde taken besteed. Dit doe ik door middel van een QSQLITE database met daarin twee tabellen. Deze benader ik middels een QSqlRelationalTableModel welke ik middels een subklasse van QSqlRelationalDelegate verbind aan een QTableView.

De database ziet er zo uit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-- Describe ACTIVITIES
CREATE TABLE activities (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    "date" TEXT NOT NULL,
    "time" INTEGER NOT NULL,
    "description" TEXT NOT NULL,
    "ibms_task" TEXT NOT NULL
)


-- Describe IBMS_TASKS
CREATE TABLE "ibms_tasks" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "name" TEXT
)


In principe werkt dit prima. Echter het toevoegen van en rij gaat nog niet helemaal naar wens. Het liefst zou ik zien dat er ieder moment een lege rij in beeld is die gevuld kan worden. Op dit moment heb ik een knop QAction welke deze toevoegd aan het model middels de volgende code:

C++:
1
2
3
4
5
6
7
8
9
10
void MainWindow::insertRecord()
{
   m_tableModel->submit();
   QSqlRecord record = m_tableModel->record();
   bool rowInserted = m_tableModel->insertRecord(-1, record);
//   int row = m_tableModel->rowCount();
 //  bool rowInserted =  m_tableModel->insertRow(row);
   qDebug() << "Insert row: " << rowInserted;
   qDebug() << QSqlDatabase::database().lastError();
}

Dit gaat goed. Vervolgens heb ik een lege rij die ik in kan vullen. Deze wordt na een enter netjes in de database gezet. Echter als ik meerdere keren een op de knop druk dan krijg ik meerdere lege rijen en vanaf dit punt snapt Qt het niet meer.
Afbeeldingslocatie: http://img228.imageshack.us/img228/7763/screenshotzm.png
Nieuwe rijen worden aan het eind toegevoegd. De rij die geedit wordt (*) is rij 4. Ik kan alleen de kollomen in rij 3 selecteren en invullen maar zodra ik een ander veld aanklik vergeet de applicatie deze data (velden blijven blanco). De andere rijen zijn uberhaupt niet te selecteren.

Iemand een idee hoe dit op te lossen of hier eerder mee te maken gehad? Onderstaande code is ter referentie toegevoegd, het is niet mijn bedoeling jullie die tot de letter door te laten lezen en debuggen :P

C++:
1
*snip*

[ Voor 45% gewijzigd door RobIII op 10-02-2011 22:15 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Euh, als je code post, beperk je dan a.u.b. tot relevante(!) delen/stukken/snippets. 130+ regels code posten en dan ons laten zoeken naar de fout is niet de bedoeling. Debuggen mag je zelf doen (Debuggen: Hoe doe ik dat?)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 11:11
Dit waren de relevante stukken? Al heb je gelijk dat het nogal wat regels waren. :? Daarom had ik heb er ook specifiek bij gezet dat de code ter referentie was en niet om volledig door te lezen/debuggen. Maargoed dan doen we het maar even zonder code in het topic blijkbaar. Oplossingen die met het probleem te maken hebben nog steeds welkom uiteraard. :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Gehakt schreef op donderdag 10 februari 2011 @ 22:29:
Dit waren de relevante stukken? Al heb je gelijk dat het nogal wat regels waren. :? Daarom had ik heb er ook specifiek bij gezet dat de code ter referentie was en niet om volledig door te lezen/debuggen. Maargoed dan doen we het maar even zonder code in het topic blijkbaar. Oplossingen die met het probleem te maken hebben nog steeds welkom uiteraard. :)
Als je nou eens begint de code te ontdoen van alles wat niet relevant is voor je probleem; een zutload van die 130+ regels waren helemaal niet nodig om het probleem te kunnen reproduceren. Als je het nou eens weet terug te brengen tot de essentie (en dat is <50 en waarschijnlijk nog wel minder regels code) dan:

a) heb je zelf een makkelijker/overzichtelijker/kaler project om je op de essentie te focussen en makkelijker aanpassingen in te maken om te zoeken naar mogelijke oplossingen
b) hebben wij minder code om door heen te moeten spitten om te zien wat er nou precies gaande is zonder zelf een project te moeten starten, die code erin te copy/pasten enz. en zien wij dus waarschijnlijk ook eerder de essentie en oorzaak van 't probleem

Maar het gaat vooral om punt a. Zoiets moet je al doen voor je een topic opent; je helpt daarmee jezelf aan een 'plezierigere' omgeving om in te rommelen en frutten tot je iets werkend hebt (en finetune je dan weer als nodig) en die oplossing pas je dan toe op je originele code. En lukt het niet dan zit je in ieder geval niet met code in de weg die niet noodzakelijk is om je probleem aan te pakken.

[edit]
Zonder diepgaande kennis van C++/Qt te hebben kan ik je code al ontdoen van meuk tot er 44 regels overblijven, en daar kan vast meer irrelevante code van af. Dat moet jou toch ook wel lukken? Ik zou 't je ge-DM'ed hebben als je DM's aan had staan maar dat heb je niet ;)

[ Voor 9% gewijzigd door RobIII op 10-02-2011 23:01 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 11:11
Mijn applicatie bestaat al uit een View-Delegate-Model-Database en niet meer dan dat. Juist het samenspel tussen deze vier componenten zorgt voor de werking zoals die nu is. De delegate kan uitgesloten worden want zonder delegate is de werking precies hetzelfde.

Mijn eigen vermoeden is dat er een submit niet correct wordt doorgevoerd of update mist waardoor een index niet meer klopt. Ik post wel code als iemand ideeen of vermoedens heeft waar het aan zou kunnen liggen.

Het toevoegen van rijen gaat in ieder geval prima maar het editten daarna niet meer:
code:
1
2
3
4
5
6
7
8
Insert row:  true 
QSqlError(-1, "", "") 
Insert row:  true 
QSqlError(-1, "", "") 
Insert row:  true 
QSqlError(-1, "", "") 
Insert row:  true 
QSqlError(-1, "", "")


Ik zie wel een verschil met het Tablemodel voorbeeld van Qt. Als je daar twee maal SqlTableModel::insertRow() uitvoert zijn de twee rijen met een * aangeduid.

[ Voor 50% gewijzigd door Gehakt op 10-02-2011 23:49 ]


Acties:
  • 0 Henk 'm!

  • Gehakt
  • Registratie: Juli 2002
  • Laatst online: 11:11
De oplossing:

C++:
1
2
3
4
5
bool MainWindow::insertRecord()
{
   m_tableModel->select();
   return  m_tableModel->insertRow(0);
}

Voer een select uit en voeg vervolgens een rij in je model in.

[ Voor 6% gewijzigd door Gehakt op 25-03-2011 22:12 ]

Pagina: 1