我一直在關注this article以在QtRuby中顯示ActiveRecord數據。我已經從那裏複製了BoatTableModel
類(其餘部分使用我自己的代碼)。在這篇文章中,BoatTableModel
被定義爲僅支持Boat
模型,但除了列定義以外,代碼是非常通用的。所以,我改變了它,而不是在那裏定義列,我已經從column_names
方法中取得了列,並且在每個模型的子類中定義了這些方法。無法在QtRuby的不同表格上顯示多個表格模型繼承自同一類別
這裏是我的代碼:
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
[email protected][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
[email protected][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
現在,當我顯示一個模型(並不重要) - 一切工作就好了。但是,當我顯示兩個模型時,每個模型都有自己的模型Qt::TableView
- 僅顯示第一個模型,另一個表視圖爲空。
我試過不同的順序,而獲得顯示它的數據的表總是最先創建的那個Qt::TableView
- 創建Qt模型的順序並不重要。另外,當我爲第一個表格創建模型對象時,但實際上並沒有將它設置爲model
屬性,第二個表格顯示它的數據。
我也嘗試在兩個不同的表視圖中顯示相同的模型兩次 - 它的工作 - 分秒,然後第二個視圖的數據消失。
我也嘗試複製粘貼QtArModel
,更改它的名稱,並使其中一個模型從副本繼承。 做了工作 - 但它顯然是一個巨大的代碼重複,所以我真的想避免這種情況。
現在,我的猜測是,QtArModel中的某些內容被定義爲類成員而不是實例成員,從而使兩個模型實例共享他們不應共享的內容。它必須在QtArModel中 - 因爲如果它在繼承樹中更高,那麼當我複製QtArModel
時,問題就會保留下來。但是,我找不到任何在我的QtArModel
中的類作用域而不是實例作用域。
我錯過了什麼?