1

私はこの記事に従って、QtRubyでActiveRecordデータを表示しています。そこからクラスをコピーしましたBoatTableModel(残りは自分のコードを使用しました)。この記事でBoatTableModelは、はモデルのみをサポートするように定義されてBoatいますが、列の定義を除いて、コードは非常に一般的です。そこで、列を定義する代わりに、メソッドから列を取得し、column_names各モデルのサブクラスでそのメソッドを定義するように変更しました。

これが私のコードです:

class QtArModel<Qt::AbstractTableModel
    def initialize(items)
        super()
        @items=items
    end

    def rowCount(parent=nil)
        @items.size
    end

    def columnCount(parent=nil)
        column_names.length
    end

    def data(index,role=Qt::DisplayRole)
        invalid=Qt::Variant.new
        return invalid unless role==Qt::DisplayRole or role==Qt::EditRole
        item=@items[index.row]
        return invalid if item.nil?

        v=item[column_names[index.column]]||""

        return Qt::Variant.new(v)
    end

    def headerData(section,orientation,role=Qt::DisplayRole)
        invalid=Qt::Variant.new
        return invalid unless role==Qt::DisplayRole

        v=case orientation
          when Qt::Horizontal
              column_names[section]
          else
              ""
          end
        return Qt::Variant.new(v.to_s)
    end

    def flags(index)
        return Qt::ItemIsEditable|super(index)
    end

    def setData(index,variant,role=Qt::EditRole)
        if index.valid? and role==Qt::EditRole
            s=variant.toString
            item=@items[index.row]
            if index.column.between?(0,column_names.length-1)
                item[column_names[index.column]]=s
            else
                raise "invalid column #{index.column}"
            end

            item.save

            emit dataChanged(index,index)
        else
            return false
        end
    end
end



class QtCoursesTableModel<QtArModel
    def column_names
        return [
            :number,
            :name,
            :tutor_name,
            :site,
            :active,
        ]
    end
end

class QtTasksTableModel<QtArModel
    def column_names
        return [
            :course,
            :ex_number,
            :received,
            :due,
            :description,
            :link,
            :completed,
            :file,
        ]
    end
end

さて、1つのモデルを表示すると(どちらでも構いません)、すべてが正常に機能します。ただし、両方のモデルを表示すると、それぞれが独自のモデルになりQt::TableViewます。最初のモデルのみが表示され、もう一方のテーブルビューは空白になります。

私は別の順序を試しましたが、そのデータを表示するテーブルは常にQt::TableView最初に作成されたものです-Qtモデルを作成する順序は重要ではありません。また、最初のテーブルのモデルオブジェクトを作成したが、実際にはそのmodelプロパティを設定していない場合、2番目のテーブルにはそのデータが表示されます。

また、同じモデルを2つの異なるテーブルビューで2回表示しようとしましたが、それは1秒間機能しましたが、2番目のビューのデータが消えました。

また、コピーして貼り付け、QtArModel名前を変更して、モデルの1つをコピーから継承させようとしました。それはうまくいきました-しかし、それは明らかに巨大なコードの重複なので、私はそれを本当に避けたいと思います。

さて、私の推測では、QtArModelの何かがインスタンスメンバーではなくクラスメンバーとして定義されており、両方のモデルインスタンスが共有すべきではないものを共有しています。QtArModelにある必要があります-継承ツリーの上位にある場合、複製したときに問題が残っていたためですQtArModelQtArModelただし、インスタンススコープではなくクラススコープのものは見つかりません。

私は何が欠けていますか?

4

1 に答える 1

0

OK、なんとかこれを解決できました。どうやら、問題は継承ではなく、GCでした。モデルへの唯一の接続はTableViewのmodelプロパティ(C ++ゲッターとセッターの単なるラッパー)からのものであったため、rubyはモデルへの参照を失ったと考え、それらをGCしました。

モデルをルビー変数に保持することで解決しました。

于 2012-03-19T18:32:00.923 に答える