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
確定 - 這似乎工作,所以謝謝你。在原始的C++教程中,我沒有看到這種情況,但是我認爲轉換隱含在聲明的MyModel :: data()的返回類型中,而類型轉換必須在Ruby代碼中顯式表達? – varro
@varro它與C++無關,但與qtruby包裝相關。在qtruby文檔中也很難找到。請參閱https://techbase.kde.org/Languages/Ruby中的「發送Ruby類」一節。 Qt/ruby包裝器能夠無縫地完成很多這些轉換,但這裏必須明確。 (前段時間我也很難弄清楚......) – bogl
感謝您的額外信息 - 我仍然需要學習更多Qt的工作方式,我將研究您引用的參考文獻。 – varro