[Kde-bindings] Qt::StandardItemModel#item_prototype= causes crashe in qtruby

Richard Dale rdale at foton.es
Tue Apr 14 19:07:53 UTC 2009


On Tuesday 14 April 2009 19:56:49 Stefano Crocco wrote:
> On Tuesday 14 April 2009, Richard Dale wrote:
> > |On Friday 10 April 2009 08:58:37 Stefano Crocco wrote:
> > |> Using Qt::StandardItemModel#item_prototype= and
> > |> Qt::StandardItemModel#horizontal_header= causes ruby to crash. Here's
> > |> the code causing the crash:
> > |>
> > |> require 'Qt4'
> > |>
> > |> app = Qt::Application.new []
> > |> m = Qt::StandardItemModel.new
> > |> proto = Qt::StandardItem.new ''
> > |> proto.flags = Qt::ItemIsEnabled
> > |> m.set_item_prototype proto
> > |> m.horizontal_header_labels = %w[x y]
> > |> app.exec
> > |>
> > |> If I comment out the call to horizontal_header_labels=, everything
> > |> works correctly.
> > |
> > |The crash is because you need to implement the clone() method in your
> > |Qt::StandardItem:
> > |
> > |require 'Qt4'
> > |
> > |class MyStandardItem < Qt::StandardItem
> > |  def clone
> > |    return MyStandardItem.new('')
> > |  end
> > |end
> > |
> > |app = Qt::Application.new []
> > |m = Qt::StandardItemModel.new
> > |proto = MyStandardItem.new ''
> > |proto.flags = Qt::ItemIsEnabled
> > |m.set_item_prototype proto
> > |m.horizontal_header_labels = %w[x y]
> > |app.exec
> > |
> > |-- Richard
>
> Sorry, I completely misunderstood what the prototype does and how it should
> be used. However, I still can't understand why my program crashes. After
> all, my prototype was an instance of QStandardItem, which does have a clone
> method. So why should it crash? Also, I tried writing the same program in
> C++, and it doesn't crash (of course, as I now understand, setting the
> prototype this way doesn't do anything, but now this is beside the point).
> Here's the C++ version:
>
> #include <QApplication>
> #include <QStandardItemModel>
> #include <QStringList>
>
> int main(int argc, char *argv[])
> {
>       QApplication app(argc, argv);
>       QStandardItemModel * m = new QStandardItemModel;
>       QStandardItem * proto = new QStandardItem;
>       proto->setFlags(Qt::ItemIsEnabled);
>       m -> setItemPrototype(proto);
>       QStringList headers;
>       headers << "x" << "y";
>       m->setHorizontalHeaderLabels(headers);
>       return app.exec();
> }
>
> Am I missing something else?
Ah, for some reason I thought that clone() was a pure virtual method, but it 
isn't. So I'm still not sure why the Ruby code crashes - I'll carry on looking 
at it.

-- Richard



More information about the Kde-bindings mailing list