On Jun 3, 8:57 pm, Andrew Lepyokhin <la.bi... / gmail.com> wrote: > Hello, > i'm still a ruby-newbie :) and will be very thankful for any advise. > I've got a table via QTableWidget. The size is set during program > execution by setRowCount/setColumnCount. Then i need to randomly fill > all cells. > I can't go .setText through every cell beacuse they're still Nill, > so i've done it like that: > > for i in (0..self.rowCount-1) do > self.setCurrentCell(i, 0) > tmp=Qt::TableWidgetItem.new > tmp.setText(rand.to_s) > self.setItem(i, 0, tmp) > end > > and here's the problem: > when table size is more than 1000x1000 my procedure is insanely slow > (because of so many .new items, i think). > So is there any good way of doing the same task without waiting for 2 > minutes? > -- > Posted viahttp://www.ruby-forum.com/. I don't think Qt::TableWidget is the best class to use for this, as you have to populate all the cells up front. I would use a Qt::TableView with a custom model to load the data lazyly instead like this: require 'Qt4' class RandomStringTableModel < Qt::AbstractTableModel def initialize(parent = nil) super(parent) end def rowCount(parent) return 1000 end def columnCount(parent) return 1000 end def data(index, role) if !index.valid? return Qt::Variant.new elsif role == Qt::ToolTipRole return Qt::Variant.new end return Qt::Variant.new(rand.to_s) end end app = Qt::Application.new(ARGV) model = RandomStringTableModel.new table = Qt::TableView.new table.model = model table.windowTitle = Qt::Object.tr("Random String View") table.resize(640, 480) table.show app.exec The above code starts straight away and you can navigate round it without any delays. I hope you don't mind if I make other comments on your code. Here are some small changes: for i in (0...rowCount) do setCurrentCell(i, 0) tmp = Qt::TableWidgetItem.new tmp.text = rand.to_s setItem(i, 0, tmp) end I've changed the Range to use three dots and so it finishes at rowCount - 1. You don't need to use 'self' so much like you do in python. In QtRuby you can write methods with names like 'setFoo' that have one argument as 'foo =' in ruby.. -- Richard