Blockierung der View aktualisierung (QTableView)
Blockierung der View aktualisierung (QTableView)
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
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
Hier ein Beispiel davon was ich meine, vielleicht habe ich mich falsch ausgedrückt
LG NoRulez
LG NoRulez
- Dateianhänge
-
- ModelExample.zip
- (2.68 KiB) 207-mal heruntergeladen
Code: Alles auswählen
for(qint32 row = 0; row < MODEL_ROWS; ++row) {
m_pModel->insertRows(m_pModel->rowCount(), 1);
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.
Für dich ist wahrscheinlich ein
Code: Alles auswählen
QCoreApplication::processEvents();Und warum weiss es dann die for-Schleife? ... hmm...das kam mir gerade eben bekannt vor..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
[...]
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); Code: Alles auswählen
m_pModel->insertRows(m_pModel->rowCount(), MODEL_ROWS);
Weil es noch andere Schleifen neben for gibt?solarix hat geschrieben:Und warum weiss es dann die for-Schleife? ...
Code: Alles auswählen
while( std::getline(file, str) ) {
// process line
}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.
@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.
@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.
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.
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]
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();
}
Außerdem wirst du mit dem Thread bestimmt noch Probleme bekommen, eil von der Gui und dem Thread ins Modell gegriffen wird!
[/code]