LINUX.ORG.RU

Qt: перенос значений из одной колонки в другую в модели QTreeView

 


0

1

Мне нужно для QTreeView записать значения третьей колонки в первую. Использую QIdentityProxyModel. Переопределил метод data, однако программа постоянно крашится, при обращении к другой колонки из-за нарушения доступа к памяти. Вообще в методе data такое можно делать? И есть ли еще способы, чтобы решить задачу (подменить элементы первой колонки элементами третьей)? Исходники позже приложу.

Мне нужно для QTreeView записать значения третьей колонки в первую.

Что значит записать? Отобразить или сохранить?

однако программа постоянно крашится, при обращении к другой колонки из-за нарушения доступа к памяти

stacktrace бы посмотреть

UVV ★★★★★
()

можно сделать такой кастыль: найти нужный элемент в модели, грохнуть его, создать элемент с нужными данными и вставит на место предыдущего.

Silerus ★★★★
()
Ответ на: комментарий от UVV

Как и QTreeView, тут проблема взаимодействия с содержимым модели. Насколько я понял тс проблема у него следующая, когда происходит изменение содержимого поля (элемента модели) изнутри программы - то программа крашится,почему то нельзя произвести операцию изменение содержимого элемента методом setText, предварительно получив его из модели.

Silerus ★★★★
()
Ответ на: комментарий от UVV

Что значит записать? Отобразить или сохранить?

Отобразить третью колонку на месте первой (и скрыть третью) Пришел домой с работы, написал тестовую программу. Она не крашится, но и не работает правильно, то есть колонки не меняет. Узнал про метод sibling у QMоdelIndex, переписал, с ним вроде работает. До этого же ссылался к другой колонке через родителя. В общем, вставляю код, закомментировал старый вариант.

class MyProxy : public QIdentityProxyModel
{
public:
    explicit MyProxy(QObject *parent = 0)
        : QIdentityProxyModel(parent)
    {
    }

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
    {
        QVariant var = QIdentityProxyModel::data(index,role);
        int row = index.row();
        if (role == Qt::DisplayRole)
          if (index.column() == 0 && index.sibling(row,2).data().isValid())
            return index.sibling(row,2).data().toString();

        return var;
//        QVariant var = QIdentityProxyModel::data(index,role);
//        int row = index.row();
//        auto parent = index.parent();
//        auto model = sourceModel();
//        if (role == Qt::DisplayRole)
//         if (parent.isValid())
//           if (parent.data().isValid())
//             if (index.column() == 0)
//               if(model->index(row, 2, parent).isValid())
//                 return  model->index(row, 2, parent).data().toString();
//        return var;

    }
};


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QStandardItemModel *model = new QStandardItemModel(this);
    QList <QStandardItem*> tempList, tempListParent;
    QStandardItem *itemParent;то значит записать? Отобразить или сохранить?

    model->setColumnCount(3);

    itemParent = new QStandardItem("row0, column0");
    tempList.clear();
    tempList << new QStandardItem("subrow0, column0") << new QStandardItem("subrow0,column1") << new QStandardItem("subrow0, column2");
    itemParent->appendRow(tempList);
    tempList.clear();
    tempList << new QStandardItem("subrow1, column0") << new QStandardItem("subrow1,column1") << new QStandardItem("subrow1, column2");
    itemParent->appendRow(tempList);
    tempListParent.clear();
    tempListParent << itemParent << new QStandardItem("row0, column1");
    model->appendRow(tempListParent);
    itemParent =  new QStandardItem("row1, column0");
    tempList.clear();
    tempList << new QStandardItem("subrow1, column0") << new QStandardItem("subrow1,column1") << new QStandardItem("subrow1, column2");
    itemParent->appendRow(tempList);
    tempListParent.clear();
    tempListParent << itemParent << new QStandardItem("row1, column1");

    model->appendRow(tempListParent);

    MyProxy *proxy = new MyProxy();
    proxy->setSourceModel(model);

    ui->treeView->setModel(proxy);
    ui->treeView->expandAll();

}
Сейчас все правильно делаю?

intruder
() автор топика
Ответ на: комментарий от intruder

Вроде норм, но я б вот так, наверное, сделал:

// if (role == Qt::DisplayRole)
if (index.column() == 0) {
    return index.sibling(row, 2).data(role);
}

UVV ★★★★★
()
Ответ на: комментарий от UVV

Вроде норм, но я б вот так, наверное, сделал:

Хорошо, спасибо. А не знаете, что с закомментированным кодом не так? Почему нельзя обращаться через родителя? Вроде же все последовательно должно обрабатываться, сверху-вниз, слева-направо, от родителя к потомку. И как правильно валидность родителя проверять?

intruder
() автор топика
Ответ на: комментарий от intruder

Лень вникать. Навскидку 2 замечания:
- лестница из 5 if'ов
- if (parent.data().isValid()) зачем проверятся валидность данных, если тебе важен только индекс?

UVV ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.