Blockierung der View aktualisierung (QTableView)

Alles rund um die Programmierung mit Qt
Antworten
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Blockierung der View aktualisierung (QTableView)

Beitrag von NoRulez »

Hallo,

besteht die Möglichkeit einer View zu sagen, dass sie sich nicht aktualisieren soll? (bsp. QTableView). Ich würde dann ein Signal schicken wenn sich die View aktualisieren soll.

Weiß jemand Rat?

LG NoRulez
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QObject::blockSignals
Model disconnecten
View löschen

Was soll das für einen Sinn machen?
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Weil Die View die GUI blockiert, sobald ich 1000 x 50 Daten einfüge.

LG NoRulez
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Bei einer QTableView macht das ja genau ein Model... es fügt die Daten zuerst ein, und sendet danach der View ein Signal.. ein Model tut also eigentlich bereits das, was du suchst.
Fügst du denn die Daten von aussen in das Model ein?
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Hier ein Beispiel davon was ich meine, vielleicht habe ich mich falsch ausgedrückt

LG NoRulez
Dateianhänge
ModelExample.zip
(2.68 KiB) 206-mal heruntergeladen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Code: Alles auswählen

	for(qint32 row = 0; row < MODEL_ROWS; ++row) {
		m_pModel->insertRows(m_pModel->rowCount(), 1);
Warum fügst du nicht gleich MODEL_ROWS ein, sondern jede Row einzeln?
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Weil ich nicht weiß wieviele Zeilen auf mich zukommen, da ich diese aus einem Quellcode parse.

LG NoRulez
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Und wieso weis es dann die for-Schleife?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Upsala hat recht ...


mach doch mal nen Prog wo du in ner schleife 50000 mal einfach nur nen qdebug() << "Bla" machst...die Schleife kostet dir hier die ganze zeit.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich denke, das ist nur ein Beispiel. Und da nimmt er sich eine Maximalzahl an Items. Wenn er später die View aus irgend welchen Dateien befüllt, liegt die Vermutung nahe, dass die Größe nicht mehr bekannt ist ;)

Für dich ist wahrscheinlich ein

Code: Alles auswählen

QCoreApplication::processEvents();
in regelmäßigen Abständen die Lösung.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

franzf hat geschrieben:[...]Wenn er später die View aus irgend welchen Dateien befüllt, liegt die Vermutung nahe, dass die Größe nicht mehr bekannt ist ;)
[...]
Und warum weiss es dann die for-Schleife? ... hmm...das kam mir gerade eben bekannt vor.. :wink:

Was upsala meinte:

Hier werden der View MODEL_ROWS Signals gesendet...

Code: Alles auswählen

 for(qint32 row = 0; row < MODEL_ROWS; ++row)
   m_pModel->insertRows(m_pModel->rowCount(), 1); 
Hier nur eines:

Code: Alles auswählen

 
m_pModel->insertRows(m_pModel->rowCount(), MODEL_ROWS);
Aber ich würde vermutlich eher ein eigenes Model implementieren, welches die Daten selbst einliesst und daher nur ein einziges Signal für den Update benötigt...
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Die Schleife weiß es deshalb, weil es nur ein Beispiel ist. Die realle Anwendung verhält sich genauso, nur weiß sie nicht wieviele Zeilen Sie einzufügen hat.

@farnzf: Das löst aber leider nicht das Problem das die GUI blockiert.

LG NoRulez
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

solarix hat geschrieben:Und warum weiss es dann die for-Schleife? ...
Weil es noch andere Schleifen neben for gibt?

Code: Alles auswählen

while( std::getline(file, str) ) {
    // process line
}
Aber all das nur, wenn es sich tatsächlich nur um test-code gehandelt hat ;)
Im Prinzip ist es ja Wurscht, es gibt Möglichkeiten die GUI zu aktualisieren oder eben (z.B. durch Threads) gleich dafür zu sorgen dass nix blockiert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

@franzf: spielt doch keine Rolle, woher die Daten kommen... (aus einer Datenbank, oder Datei oder sonstwoher). Nach diesem while() weiss das Programm, wieviele Eintraege es sind :wink:

@NoRulez: Das ist gefaehrlich, was du (in deinem Beispiel) da tust.. die Signal-Verbindung zwischen Model und View hast du nicht in der Hand. Das bedeutet, dass bei insertRows() und setData() unter Umstaenden GUI-Code im Thread-Kontext (bei einer DirectConnection) laeuft. Klar koennte man was basteln (wie upsala schon gesagt hat, mit blockSignals oder Model kurzzeitig komplett von der GUI abhaengen). Aber sauber ist IMHO nur ein eigenes Model. Dieses koennte dann (falls ueberhaupt noch notwendig) mit einem internen Thread die Datenmenge aufbereiten.
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Ich hätte da noch eine Anregung.
Bau dir in das Modell eine Methode insertData(...), in der du die Daten direkt in deinen Datenspeicher tust.

Code: Alles auswählen

void MeinModel::insertData( Daten )
{
    beginResetModel (); // QT 4.6.2
    // Daten einfügen z.B. mit Schleife
    endRestModel();
}
Dann baut sich dein View im Anschluß neu auf. Du hast dann wesentlich weniger Signale die hin und her laufen und mußt nicht vorher wissen wieviel dazukommen.
Außerdem wirst du mit dem Thread bestimmt noch Probleme bekommen, eil von der Gui und dem Thread ins Modell gegriffen wird!
[/code]
Antworten