私はこの記事に従って、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にある必要があります-継承ツリーの上位にある場合、複製したときに問題が残っていたためですQtArModel
。QtArModel
ただし、インスタンススコープではなくクラススコープのものは見つかりません。
私は何が欠けていますか?