2016-06-10 13 views
1

Ich habe eine QTableView und eine Schaltfläche. Ich habe Signal und Slot verwendet, um die Tabellenansicht mit einer Funktion zu verbinden. Der Slot führt folgende Funktion aus. Wenn der Benutzer eine einzelne Zeile auswählt, muss die Schaltfläche aktiviert sein. Wenn der Benutzer keine Zeile auswählt oder wenn mehr als eine Zeile ausgewählt ist, muss die Schaltfläche deaktiviert werden. Dies ist der Code.Qt-Signal und Steckplatz funktioniert nicht, wenn QTableView aktualisiert wird

connect(ui->client_table->selectionModel(),SIGNAL(selectionChanged(const QItemSelection &, constQItemSelection &)),SLOT(disableButtons(const QItemSelection &, const QItemSelection &))); 

Das Problem beginnt, wenn ich die Tabellenansicht aktualisiere. Dann hören das Signal und der Schlitz auf zu arbeiten. Der Code zum Aktualisieren der Tabelle ist unten angegeben.

Wie kann ich den Code ändern, so dass ich die Tabelle zusammen mit der Implementierung des Signals und Slot-Mechanismus aktualisieren kann.

+2

Per die [Qt-Dokumentation] (http://doc.qt.io/qt-5/qabstractitemview.html#setModel). "Legt das Modell für die darzustellende Ansicht fest. Mit dieser Funktion wird ein neues Auswahlmodell erstellt und festgelegt, das alle zuvor mit setSelectionModel() festgelegten Modelle ersetzt. Das alte Auswahlmodell wird jedoch nicht gelöscht, da es freigegeben werden kann zwischen mehreren Ansichten. Wir empfehlen, das alte Auswahlmodell zu löschen, wenn es nicht mehr benötigt wird. " - Die Signall/Slot-Verbindung funktioniert nicht mehr, da das Auswahlmodell ersetzt wurde. –

+0

Der Aufruf von ['QSqlQueryModel :: setQuery'] (http://doc.qt.io/qt-5/qsqlquerymodel.html#setQuery) setzt das Modell zurück. Sie müssen nicht jedes Mal ein neues Modell erstellen, wenn Sie eine Abfrage ausführen. Initialisieren Sie Objekte auch nicht mit "new", es sei denn, Sie benötigen sie, um über den aktuellen Bereich hinaus zu überleben. Zum Beispiel können Sie 'QSqlQuery' mit nur 'QSqlQuery query (" ... ", db.digidb) initialisieren;' – thuga

Antwort

0

Fügen Sie diese zu Beginn der refresh() aufzuräumen:

disconnect(ui->client_table->selectionModel(),SIGNAL(selectionChanged(const QItemSelection &, constQItemSelection &)),SLOT(disableButtons(const QItemSelection &, const QItemSelection &))); 

Und dann diese mit Ihnen neue Modell am Ende der Auffrischung zu verbinden() verwenden:

connect(ui->client_table->selectionModel(),SIGNAL(selectionChanged(const QItemSelection &, constQItemSelection &)),SLOT(disableButtons(const QItemSelection &, const QItemSelection &))); 
+0

Warum nicht einfach das Modell einmal erstellen und setzen, statt jedes Mal, wenn die Aktualisierung durchgeführt wird. Dies behebt auch nicht das Speicherleck. –

+0

@JamesAdkison Die Frage war, dass das Signal nicht funktioniert - ich habe nur eine Lösung dafür gepostet. Auch das OP "kann" an anderer Stelle eine ordentliche Funktion haben, um mit der Speicherzuweisung umzugehen - kann das nicht wirklich sagen, da wir nicht den ganzen Code haben. –