[Kde-bindings] Qt::StandardItemModel#item_prototype= causes crashe in qtruby
Richard Dale
rdale at foton.es
Wed Apr 15 18:41:53 UTC 2009
On Tuesday 14 April 2009 20:07:53 Richard Dale wrote:
> 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.
The crash is happening in the QStandardItem copy constructor.
I think the cause of the problem might be that we added a 'binding' instance
variable to each class in the smoke lib for virtual method callbacks, and it
would need to be initialized when an instance of x_QStandardItem is copied.
class x_QStandardItem : public QStandardItem {
SmokeBinding* _binding;
public:
void x_0(Smoke::Stack x) {
// set the smoke binding
_binding = (SmokeBinding*)x[1].s_class;
}
..
If the copy is done in the superclass, then this isn't going to happen.
QStandardItem::QStandardItem(const QStandardItem &other)
: d_ptr(new QStandardItemPrivate)
{
Q_D(QStandardItem);
d->q_ptr = this;
operator=(other);
}
So this is quite tricky to fix, and needs a bit of thinking about.
-- Richard
More information about the Kde-bindings
mailing list