Невозможно отобразить более одной табличной модели, наследующей от одного и того же класса в разных таблицах в QtRuby - PullRequest
1 голос
/ 15 марта 2012

Я следил за этой статьей , чтобы отобразить данные ActiveRecord в QtRuby.Я скопировал класс BoatTableModel оттуда (использовал мой собственный код для остального).В статье BoatTableModel определено только для поддержки модели Boat, но, за исключением определений столбцов, код довольно универсален.Итак, я изменил его, поэтому вместо того, чтобы определять столбцы, я взял столбцы из метода column_names и определил эти методы в подклассах для каждой модели.

Вот мойкод:

class QtArModel<Qt::AbstractTableModel
    def initialize(items)
        super()
        @items=items
    end

    def rowCount(parent=nil)
        @items.size
    end

    def columnCount(parent=nil)
        column_names.length
    end

    def data(index,role=Qt::DisplayRole)
        invalid=Qt::Variant.new
        return invalid unless role==Qt::DisplayRole or role==Qt::EditRole
        item=@items[index.row]
        return invalid if item.nil?

        v=item[column_names[index.column]]||""

        return Qt::Variant.new(v)
    end

    def headerData(section,orientation,role=Qt::DisplayRole)
        invalid=Qt::Variant.new
        return invalid unless role==Qt::DisplayRole

        v=case orientation
          when Qt::Horizontal
              column_names[section]
          else
              ""
          end
        return Qt::Variant.new(v.to_s)
    end

    def flags(index)
        return Qt::ItemIsEditable|super(index)
    end

    def setData(index,variant,role=Qt::EditRole)
        if index.valid? and role==Qt::EditRole
            s=variant.toString
            item=@items[index.row]
            if index.column.between?(0,column_names.length-1)
                item[column_names[index.column]]=s
            else
                raise "invalid column #{index.column}"
            end

            item.save

            emit dataChanged(index,index)
        else
            return false
        end
    end
end



class QtCoursesTableModel<QtArModel
    def column_names
        return [
            :number,
            :name,
            :tutor_name,
            :site,
            :active,
        ]
    end
end

class QtTasksTableModel<QtArModel
    def column_names
        return [
            :course,
            :ex_number,
            :received,
            :due,
            :description,
            :link,
            :completed,
            :file,
        ]
    end
end

Теперь, когда я показываю одну модель (неважно какая) - все работает просто отлично.Тем не менее, когда я отображаю обе модели, каждая из которых имеет свою собственную Qt::TableView - отображается только первая, а другое табличное представление пусто.

Я пробовал различный порядок, и таблица, которая получаетсначала показываются данные, для которых Qt::TableView создается первым - порядок создания моделей Qt не имеет значения.Кроме того, когда я создаю объект модели для первой таблицы, но на самом деле не устанавливаю для него свойства model, во второй таблице отображаются его данные.

Я также пытался отобразить ту же модельдважды в двух разных табличных представлениях - и это работало - на долю секунды, а затем данные второго представления исчезли.

Я также попытался скопировать-вставить QtArModel, изменить его имя и сделатьодна из моделей наследуется от копии.Это сработало , но очевидно, что это огромное дублирование кода, поэтому я действительно хотел бы избежать этого.

Теперь я предполагаю, что что-то в QtArModel определено как член класса вместочлен экземпляра, заставляющий оба экземпляра модели совместно использовать то, что им не следует делить.Это должно быть в QtArModel - потому что если бы оно было выше в дереве наследования, проблема осталась бы, если бы я продублировал QtArModel.Однако в моем QtArModel я не могу найти ничего, что относится к классу, а не к экземпляру.

Чего мне не хватает?

1 Ответ

0 голосов
/ 19 марта 2012

ОК, мне удалось это решить.Видимо, проблема была не в наследстве, а в ГК.Так как единственное соединение с моделями было из свойства TableView model - которое является просто оберткой для геттеров и сеттеров C ++ - ruby ​​решил, что он потерял ссылку на мои модели, и GC'd их.

Решенохранение моделей в переменных ruby.

...