Seite 1 von 1
Blockierung der View aktualisierung (QTableView)
Verfasst: 29. April 2010 09:54
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
Verfasst: 29. April 2010 22:14
von upsala
QObject::blockSignals
Model disconnecten
View löschen
Was soll das für einen Sinn machen?
Verfasst: 30. April 2010 20:35
von NoRulez
Weil Die View die GUI blockiert, sobald ich 1000 x 50 Daten einfüge.
LG NoRulez
Verfasst: 1. Mai 2010 10:16
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?
Verfasst: 1. Mai 2010 11:56
von NoRulez
Hier ein Beispiel davon was ich meine, vielleicht habe ich mich falsch ausgedrückt
LG NoRulez
Verfasst: 1. Mai 2010 13:14
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?
Verfasst: 1. Mai 2010 17:30
von NoRulez
Weil ich nicht weiß wieviele Zeilen auf mich zukommen, da ich diese aus einem Quellcode parse.
LG NoRulez
Verfasst: 1. Mai 2010 22:50
von upsala
Und wieso weis es dann die for-Schleife?
Verfasst: 2. Mai 2010 22:41
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.
Verfasst: 3. Mai 2010 08:13
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
in regelmäßigen Abständen die Lösung.
Verfasst: 3. Mai 2010 09:07
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..
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...
Verfasst: 3. Mai 2010 09:18
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
Verfasst: 3. Mai 2010 09:20
von franzf
solarix hat geschrieben:Und warum weiss es dann die for-Schleife? ...
Weil es noch andere Schleifen neben for gibt?
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.
Verfasst: 3. Mai 2010 10:51
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
@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.
Verfasst: 3. Mai 2010 14:55
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]