Я следил за этой статьей , чтобы отобразить данные ActiveRecord в QtRuby.Я скопировал класс 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
Теперь, когда я показываю одну модель (неважно какая) - все работает просто отлично.Тем не менее, когда я отображаю обе модели, каждая из которых имеет свою собственную Qt::TableView
- отображается только первая, а другое табличное представление пусто.
Я пробовал различный порядок, и таблица, которая получаетсначала показываются данные, для которых Qt::TableView
создается первым - порядок создания моделей Qt не имеет значения.Кроме того, когда я создаю объект модели для первой таблицы, но на самом деле не устанавливаю для него свойства model
, во второй таблице отображаются его данные.
Я также пытался отобразить ту же модельдважды в двух разных табличных представлениях - и это работало - на долю секунды, а затем данные второго представления исчезли.
Я также попытался скопировать-вставить QtArModel
, изменить его имя и сделатьодна из моделей наследуется от копии.Это сработало , но очевидно, что это огромное дублирование кода, поэтому я действительно хотел бы избежать этого.
Теперь я предполагаю, что что-то в QtArModel определено как член класса вместочлен экземпляра, заставляющий оба экземпляра модели совместно использовать то, что им не следует делить.Это должно быть в QtArModel - потому что если бы оно было выше в дереве наследования, проблема осталась бы, если бы я продублировал QtArModel
.Однако в моем QtArModel
я не могу найти ничего, что относится к классу, а не к экземпляру.
Чего мне не хватает?