2010-03-17 7 views
2

Je commence à être bizarre avec QtRuby lorsque j'utilise un TableWidget. Le widget de la table se charge, mais lorsque vous cliquez sur les éléments de la ligne, l'application segfaults et se bloque.RubyQt Crashing sur 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 

Le semble impliquer backtrace qu'il bombarde dans 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 

Si j'Override mousePressEvent et mouseMoveEvent, ce genre d'accidents ne se produisent. Est-ce que je fais quelque chose de mal ici, ou est-ce que je peux décrire cela comme un bug dans QtRuby?

Je suis sur fedora11, avec les paquetages suivants:

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

Ces accidents aussi se produire lors de l'exécution du script sur Windows.

+0

Pouvons-nous obtenir le backtrace entier? plutôt que seulement deux cadres de pile? Le problème peut être plus profond que les gestionnaires d'événements –

+0

Backtrace ici: http://gja.in/pub/qt-ruby-backtrace.txt – gja

Répondre

3

Vous utilisez un Qt :: TableWidget lorsque vous devez utiliser un Qt :: TableView. Le code suivant a corrigé le crash pour moi. En plus d'un passage de Qt :: TableWidget à Qt :: TableView, j'ai également réimplémenté la méthode d'index, juste au cas où. :)

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

Je réalise que QTableView ne plante pas lorsqu'il est utilisé. Cependant, je voudrais implémenter d'autres méthodes de QWidget telles que keypressEvent, etc ... Recommanderiez-vous juste d'encapsuler mon TableView dans un autre widget? Liens vers la trace complète en tant que commentaire à l'article original – gja

+0

Je ne recommanderais pas d'envelopper votre vue de table dans un autre widget. Tout ce que vous pouvez faire avec TableWidget, vous pouvez le faire avec un TableView. Un TableView est un widget, donc vous pouvez toujours gérer les événements de la même manière. La chaîne d'héritage de QTableView (C++) finit par se terminer par QWidget. QTableWidget hérite en réalité de QTableView. –

+0

OK, je suis convaincu, cela semble bien fonctionner. Je me demande toujours pourquoi cela se bloque, purement d'un point de vue académique. Merci de répondre :-) – gja

Questions connexes