2012-03-15 48 views
1

我一直在關注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中的類作用域而不是實例作用域。

我錯過了什麼?

回答

0

好的,我設法解決了這個問題。顯然,問題不是繼承,而是GC。由於與模型的唯一連接來自TableView的model屬性 - 這只是C++ getter和setter的包裝 - ruby​​認爲它失去了對我的模型的引用,並且GC'd它們。

通過保持ruby變量中的模型解決。

相關問題