2010-03-17 5 views
2

Я получаю некоторые странности с QtRuby при использовании TableWidget. Виджет таблицы загружается, но когда вы нажимаете на элементы в строке, приложение segfaults и сбои.RubyQt Crashing on QTableWidget

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 рубин-1.8.6.369-1.fc11.i586

Эти сбои также происходят при запуске скрипта в Windows.

+0

Можем ли мы получить всю обратную трассу? а не только два кадра стека? Проблема может быть глубже, чем обработчики событий –

+0

Backtrace здесь: http://gja.in/pub/qt-ruby-backtrace.txt – gja

ответ

3

Вы используете Qt :: TableWidget, когда вы должны использовать Qt :: TableView. Следующий код исправил ошибку для меня. В дополнение к переключению с Qt :: TableWidget на Qt :: TableView, я также переопределял метод индекса, на всякий случай. :)

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 
+0

Я понимаю, что QTableView не сбой при использовании. Тем не менее, я хотел бы реализовать некоторые другие методы QWidget, такие как keypressEvent и т. Д. Вы порекомендовали бы просто обернуть мой TableView в другом виджете? Ссылка на полный backtrace как комментарий к исходному сообщению – gja

+0

Я бы не рекомендовал обертывать ваш вид таблицы другим виджетам. Все, что вы можете сделать с помощью TableWidget, вы можете сделать с помощью TableView. TableView - это виджет, поэтому вы можете обрабатывать события одинаково. Цепочка наследования для QTableView (C++) в конечном итоге заканчивается QWidget. QTableWidget фактически наследуется от QTableView. –

+0

ОК, я убежден, что это хорошо работает. Все еще интересно, почему это рушится, только с академической точки зрения. Спасибо за ответ :-) – gja