【问题标题】:RubyQt Crashing on QTableWidgetRubyQt 在 QTableWidget 上崩溃
【发布时间】:2010-03-17 11:27:25
【问题描述】:

在使用 TableWidget 时,我对 QtRuby 感到有些奇怪。表格小部件会加载,但当您单击行中的元素时,应用会出现段错误并崩溃。

require 'Qt4'

class SimpleModel < Qt::AbstractTableModel

    def rowCount(parent)
        return 1
    end

    def columnCount(parent)
        return 1
    end

    def data(index, role=Qt::DisplayRole)
        return Qt::Variant.new("Really Long String") if index.row == 0 and index.column == 0 and role == Qt::DisplayRole
        return Qt::Variant.new
    end

end

Qt::Application.new(ARGV) do
    Qt::TableWidget.new(1, 1) do
        set_model SimpleModel.new
        show
    end

    exec

end

回溯似乎暗示它正在mousePressEvent中轰炸

#6  0x01624643 in QAbstractItemView::pressed(QModelIndex const&) () from /usr/lib/libQtGui.so.4

#7  0x016306f5 in QAbstractItemView::mousePressEvent(QMouseEvent*) () from /usr/lib/libQtGui.so.4

如果我覆盖 mousePressEvent 和 mouseMoveEvent,则不会再发生此类崩溃。我在这里做错了什么,还是我可以将其归为 QtRuby 中的错误?

我在 fedora11 上,安装了以下软件包:

QtRuby-4.4.0-1.fc11.i586 ruby-1.8.6.369-1.fc11.i586

在 Windows 上运行脚本时也会发生这些崩溃。

【问题讨论】:

标签: ruby qt qtableview qtruby


【解决方案1】:

当您应该使用 Qt::TableView 时,您正在使用 Qt::TableWidget。以下代码为我修复了崩溃。除了从 Qt::TableWidget 切换到 Qt::TableView 之外,我还重新实现了 index 方法,以防万一。 :)

require 'Qt4'

class SimpleModel < Qt::AbstractTableModel

    def rowCount(parent)
        return 1
    end

    def columnCount(parent)
        return 1
    end

    def data(index, role=Qt::DisplayRole)
        return Qt::Variant.new("Really Long String") if index.row == 0 and index.column == 0 and role == Qt::DisplayRole
        return Qt::Variant.new
    end

    def index(row, column, parent)
        if (row > 0 || column > 0)
            return Qt::ModelIndex.new
        else
            return createIndex(row, column, 128*row*column)
        end
    end 
end

Qt::Application.new(ARGV) do
    Qt::TableView.new do
        set_model SimpleModel.new
        show
    end

    exec
end

【讨论】:

  • 我意识到QTableView在使用时不会崩溃。但是,我想实现一些其他的 QWidget 方法,例如 keypressEvent 等...您是否建议将我的 TableView 包装在其他一些小部件中?链接到完整的回溯作为对原始帖子的评论
  • 我不建议将您的表格视图包装在另一个小部件中。任何你可以用 TableWidget 做的事情,你都可以用 TableView 做。 TableView 是一个小部件,因此您仍然可以以相同的方式处理事件。 QTableView (C++) 的继承链最终以 QWidget 结束。 QTableWidget 实际上继承自 QTableView。
  • 好的,我确信,这似乎运作良好。仍然想知道为什么这会崩溃,但纯粹从学术角度来看。感谢您的回复:-)
  • 对我来说,它崩溃了,因为没有 QTableWidgetItem 来包装模型项目,因为您直接设置模型,而不是使用基于项目的 API。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多