2016-08-18 46 views
2

我想弄清楚如何使用qtruby模型使用TableView。我試着修改了C++中的例子,在 http://doc.qt.io/qt-5/modelview.html給出的教程中,並提出瞭如下所示的代碼。如何使用qtruby獲取模型/視圖工作表?

問題在於AbstractTableModel的數據方法的實現:只有角色Qt :: DisplayRole按預期工作。角色Qt :: FontRole和Qt :: BackgroundRole不會導致錯誤,但似乎也不會做任何事情。更糟糕的是,如果啓用了角色Qt :: TextAlignmentRole和Qt :: CheckStateRole會導致分段錯誤。有人能告訴我我在這裏做錯了什麼嗎?

#!/usr/bin/env ruby 
require 'Qt' 
include Qt 

class MyModel < AbstractTableModel 
    def initialize(p) 
    super 
    end 

    def rowCount(p) 
    2 
    end 

    def columnCount(p) 
    3 
    end 

    def data(index, role) 
    row = index.row 
    col = index.column 

    case role 
    when Qt::DisplayRole 
     return Variant.new "Row#{row + 1}, Column#{col + 1}" 
    when Qt::FontRole 
     # this doesn't result in an error, but doesn't seem to do anything either 
     if (row == 0 && col == 0) 
     boldFont = Font.new 
     boldFont.setBold(true) 
     return boldFont 
     end 
    when Qt::BackgroundRole 
     # this doesn't result in an error, but doesn't seem to do anything either 
     if (row == 1 && col == 2) 
     redBackground = Brush.new(Qt::red) 
     return redBackground 
     end 
    when Qt::TextAlignmentRole 
     # # the following causes a segmentation fault if uncommented 
     # if (row == 1 && col == 1) 
     # return Qt::AlignRight + Qt::AlignVCenter 
     # end 
    when Qt::CheckStateRole 
     # # the following causes a segmentation fault if uncommented 
     # if (row == 1 && col == 0) 
     # return Qt::Checked 
     # end 
    end 
    Variant.new 
    end 
end 

app = Application.new ARGV 
tableView = TableView.new 
myModel = MyModel.new(nil) 
tableView.setModel(myModel) 
tableView.show 
app.exec 

回答

1

這是因爲對於DisplayRole,您正在按預期創建一個新的Qt :: Variant。

對於其他的返回值,你應該使用:

return Qt::Variant.fromValue(boldFont) 

return Qt::Variant.fromValue(redBackground) 

return Qt::Variant.fromValue(Qt::AlignRight + Qt::AlignVCenter) 

return Qt::Variant.fromValue(Qt::Checked) 
+0

確定 - 這似乎工作,所以謝謝你。在原始的C++教程中,我沒有看到這種情況,但是我認爲轉換隱含在聲明的MyModel :: data()的返回類型中,而類型轉換必須在Ruby代碼中顯式表達? – varro

+0

@varro它與C++無關,但與qtruby包裝相關。在qtruby文檔中也很難找到。請參閱https://techbase.kde.org/Languages/Ruby中的「發送Ruby類」一節。 Qt/ruby​​包裝器能夠無縫地完成很多這些轉換,但這裏必須明確。 (前段時間我也很難弄清楚......) – bogl

+0

感謝您的額外信息 - 我仍然需要學習更多Qt的工作方式,我將研究您引用的參考文獻。 – varro