2016-05-25 31 views
0

Ich verwende QtQuick TableView zum Anzeigen von Daten aus einer Datenbank über QSqlTableModel und QSortFilterProxyModel.QtQuick TableView löschen Zeile funktioniert nicht

Der Zeilenentfernungsvorgang funktioniert nicht so, wie er sollte. Ich habe eine Methode in einer Klasse implementiert, die von QSortFilterProxyModel abgeleitet wurde, um removeRows-Methoden von QSortFilterProxyModel aufzurufen.

Alles funktioniert korrekt, solange ich einen Filter in QSortFilterProxyModel gesetzt habe (ich setze es durch ein Textfeld). Wenn der Filter jedoch leer ist, dekrementiert die TableView rowCount-Eigenschaft nicht und nach jedem Löschen wird die currentRow-Eigenschaft auf rowCount-2 festgelegt. Warum? Für mich sieht es wie ein Fehler aus. Warum funktioniert es, wenn der Filter nicht leer ist?

 Q_INVOKABLE void eliminaCliente(int row) { 
      removeRows(row,1); 
     } 

import QtQuick 2.6 
import QtQuick.Controls 1.5 
import QtQuick.Layouts 1.3 
import QtQuick.Dialogs 1.2 
import Material 0.2 
import Material.ListItems 0.1 

ApplicationWindow { 
    id: root 
    visible: true 
    width: 1024 
    height: 640 
    title: qsTr("assiBase") 

    Page { 
     id: pLayout 
     anchors.fill: parent 

     ColumnLayout { 
      anchors.fill: parent 

      Toolbar { 
       id: aBar 
       Layout.fillWidth: true 
       page: pLayout 
       backgroundColor: "#eeeeee" 

       RowLayout { 
        anchors.fill: parent 

        ActionButton { 
         id: addButton 
         Layout.leftMargin: 10 
         iconName: "content/add_circle" 
         backgroundColor: "#4CAF50" 
         onClicked: modalDialog.show() 
         isMiniSize: true 
        } 

        ActionButton { 
         id: editButton 
         iconName: "content/create" 
         isMiniSize: true 
        } 

        ActionButton { 
         id: deleteButton 
         iconName: "action/delete" 
         isMiniSize: true 
         backgroundColor: "#FF0000" 
         onClicked: { 
          if (dataView.currentRow != -1) { 
           var r = dataView.currentRow 
           console.log(dataView.currentRow) 
           sqlSortedData.eliminaCliente(dataView.currentRow) 
           console.log(dataView.rowCount) 
           //dataView.currentRow = r 

          } 
         } 
        } 

        RowLayout { 
         Layout.alignment: Qt.AlignRight 

         Icon { 
          name: "action/search" 
          Layout.alignment: Qt.AlignBottom 
         } 

         TextField { 
          id: searchBox 
          Layout.rightMargin: 20 
          Layout.minimumWidth: 400 
          Layout.preferredWidth: 500 
          placeholderText: qsTr("cerca...") 
          onTextChanged: sqlSortedData.setFilterWildcard(searchBox.text) 
          font.capitalization: Font.MixedCase 
         } 
        } 
       } 
      } 

      TableView { 
       anchors.top: aBar.bottom 
       anchors.topMargin: 3 
       sortIndicatorVisible: true 
       frameVisible: false 
       Layout.fillWidth: true 
       Layout.fillHeight: true 
       onSortIndicatorColumnChanged: model.sort(sortIndicatorColumn, sortIndicatorOrder) 
       onSortIndicatorOrderChanged: model.sort(sortIndicatorColumn, sortIndicatorOrder) 
       id: dataView 

       TableViewColumn { 
        role: "ID" 
        visible: false 
       } 

       TableViewColumn { 
        role: "Nome" 
        title: "Nome" 
        width: 200 
       } 

       TableViewColumn { 
        role: "Residenza" 
        title: "Residenza" 
        width: 200 
       } 

       TableViewColumn { 
        role: "Assicurazione" 
        title: "Assicurazione" 
        width: 200 
       } 

       TableViewColumn { 
        width: 128 
        resizable: false 


        delegate: RowLayout { 
          anchors.fill: parent 
          clip: true 

          IconButton { 
           iconName: "content/create" 
           onClicked: console.log(styleData.row) 
          } 

          IconButton { 
           iconName: "action/delete" 
           onClicked: { 
            console.log(styleData.row) 
            sqlSortedData.eliminaCliente(styleData.row) 
            console.log(dataView.rowCount) 
           } 
          } 
        } 
       } 

       model: sqlSortedData 
      } 
     } 
    } 
+0

Verfolgen Sie Ihre currentRow im root-Element, dann versuchen Sie TableView.model.remove (root.currentRow) – Ashif

+0

Danke für die Antwort. Allerdings habe ich festgestellt, dass QSortFilterProxyModel der Schuldige ist. In der Tat wird rowCount nicht aktualisiert, wenn der Filter leer ist. Das Problem liegt also in QSortFilterProxyModel und nicht in TableView. – paolino

Antwort

0

Werfen Sie einen Blick auf here. Es gibt einen Workaround-Vorschlag. Es scheint, als ob QSortFilterProxyModel eine Liebe für eine lange Zeit braucht.