Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QTreeView\QStandardItemModel значение в n-столбце 
V
    Опции темы
becks
Дата 1.10.2012, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Добрый день!

Есть QTreeView для него модель QStandardItemModel. QTreeView содержит 3 колонки. До сих пор заполнял только первую с помощью appendRow, где был только 1 элемент.

Теперь появилась задача по клику на элементе из первой колонки вывести некоторую инфу во 2 и 3 колонку этой строки.

как получить текущий item (по которому был клик) знаю:

Код

QModelIndex index = ui->treeView->currentIndex();
        if (!index.isValid())
            return;

QStandardItem *item = model->itemFromIndex(index);


Как теперь в строке (что и у этого item'a) вставить значения для 2 и 3 столбца?
PM MAIL   Вверх
kilopmer
Дата 2.10.2012, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.10.2011

Репутация: 1
Всего: 1



Просто в той же строке, что и у index, меняешь две колонки.
Код

...
    connect(ui->treeView,SIGNAL(clicked(QModelIndex)),this,SLOT(onTreeClicked(QModelIndex)));
}
void TreeDialog::onTreeClicked(QModelIndex index)
{

    if(index.column()==0)
    {
        model->item(index.row(),1)->setText("new text");
        model->item(index.row(),2)->setText("new text");

    }

}

PM MAIL   Вверх
becks
Дата 2.10.2012, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Что-то у меня падает на этих строке.

Код

model->item(index.row(),1)->setText("new text");


Просто сейчас я когда добавлял данные в модель использовал:

Код

search_item->appendRow(item);


где item - это один единственный item, а не лист из 3 item.


Сейчас я поменял на:

Код

QStandardItem *empty_item1 = new QStandardItem(""); QStandardItem *empty_item2 = new QStandardItem("");
QList<QStandardItem *> items; items << item << empty_item1 << empty_item2;

search_item->appendRow(items);


И все равно падает.
PM MAIL   Вверх
kilopmer
Дата 2.10.2012, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.10.2011

Репутация: 1
Всего: 1



Вот так работает. 
Код

TreeDialog::TreeDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::TreeDialog)
{
    ui->setupUi(this);
    model=new QStandardItemModel();
    QStandardItem *parentItem = model->invisibleRootItem();
    QList<QStandardItem *> list;
    for (int i = 0; i < 4; ++i)
    {

        QStandardItem *item1 = new QStandardItem(QString("item %0").arg(i));
        QStandardItem *item2 = new QStandardItem(QString("item %0").arg(i));
        QStandardItem *item3 = new QStandardItem(QString("item %0").arg(i));
        list.clear();
        list<<item1<<item2<<item3;
        parentItem->appendRow(list);
    }
    parentItem->setText("main");
    ui->treeView->setModel(model);
    connect(ui->treeView,SIGNAL(clicked(QModelIndex)),this,SLOT(onTreeClicked(QModelIndex)));
}

TreeDialog::~TreeDialog()
{
    delete ui;
}
void TreeDialog::onTreeClicked(QModelIndex index)
{
 
    if (index.column()==0)
    {
        model->item(index.row(),1)->setText("new text");
        model->item(index.row(),2)->setText("new text");

    }
}


У вас вообще  табличка появляется? 
PM MAIL   Вверх
becks
Дата 2.10.2012, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Сейчас попробую все понятно и подробно расписать.

Код

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ....
    ui->setupUi(this);

    model = new QStandardItemModel(this);
    model->setColumnCount(3);
    ui->treeView->setModel(model);

    ui->treeView->header()->setStretchLastSection(false);
    ui->treeView->header()->setResizeMode(0, QHeaderView::Stretch); model->setHeaderData(0, Qt::Horizontal, "Результаты");
    ui->treeView->header()->setResizeMode(1, QHeaderView::Interactive); model->setHeaderData(1, Qt::Horizontal, "Реферат");
    ui->treeView->header()->setResizeMode(2, QHeaderView::Interactive); model->setHeaderData(2, Qt::Horizontal, "Рубрика");
    ....
}


Потом добавляю некоторый item, будем называть его заданием (иконка человечка на графе). Он всегда добавляется в конец списка главного уровня (наследники от рута):
Код

void MainWindow::AddObjectToTree(QString FilePath, QString ObjectText, QString ObjectType)
{

    // Создание item'a и установка в модель
    QStandardItem *item = new QStandardItem(Icon, ObjectText);
    item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);

    item->setData(FilePath, Qt::UserRole + 1);
    item->setData(ObjectType, Qt::UserRole + 2);

    model->setItem(model->rowCount(), item);

    // Получение индекса и установка его текущим
    setCurrentIndex(item->index());
}


По этому заданию выполняются некоторые действия в результате которых к нему добавляются чайлды. Добавляются они через appendRow(). Единственное, я не всегда добавляю список, состоящий из 3 айтемов.

Все дерево у меня сформировано, например, так (кое что прикрыл прямоугольничками):
user posted image

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


Это сообщение отредактировал(а) becks - 2.10.2012, 11:33
PM MAIL   Вверх
kilopmer
Дата 2.10.2012, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.10.2011

Репутация: 1
Всего: 1



кликните именно на "результаты", тогда вылета не будет? (пока добавляйте просто строку одинаковую для всех)
PM MAIL   Вверх
kilopmer
Дата 2.10.2012, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.10.2011

Репутация: 1
Всего: 1



а все понятно, Вам просто надо аккуратно родителя отслеживать, через parent() (у QModelIndex). Вы как конкретно хотите сделать, чтобы при щелчке, на "Результаты" срабатывало, или на дочерние, или и то и другое?)
PM MAIL   Вверх
becks
Дата 2.10.2012, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Переделал добавление, теперь везде appendRow() добавляет только списки из 3 элементов.

Причем для проверки добавляю в appendRow() лист не с пустыми 2 и 3 элементом, а с некоторым текстом, текст успешно добавляется в колонки. 


Что имеем. Если кликать на элемент с "человечком", то вуаля текст во 2 и 3  колонках меняется. Если кликать по их дочерним элементам типа "Страница","Результаты", элемент с Домиком или телефоном, то либо ничего не происходит, текст во 2 и 3 колонках не меняется, либо программа падает.
PM MAIL   Вверх
kilopmer
Дата 2.10.2012, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.10.2011

Репутация: 1
Всего: 1



Цитата

Что имеем. Если кликать на элемент с "человечком", то вуаля текст во 2 и 3  колонках меняется. Если кликать по их дочерним элементам типа "Страница","Результаты", элемент с Домиком или телефоном, то либо ничего не происходит, текст во 2 и 3 колонках не меняется, либо программа падает. 

Надо аккуратно отслеживать родителя, так как у них нумерация в каждом потомке заново начинается, и менять текст именно в потомках.  

Это сообщение отредактировал(а) kilopmer - 2.10.2012, 13:57
PM MAIL   Вверх
becks
Дата 2.10.2012, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата

а все понятно, Вам просто надо аккуратно родителя отслеживать, через parent() (у QModelIndex). Вы как конкретно хотите сделать, чтобы при щелчке, на "Результаты" срабатывало, или на дочерние, или и то и другое?) 



Я бы хотел чтобы на любом элементе из колонки результаты срабатывало.
Представляете как сделать? Если я правильно понимаю индекс завязан на родителя, и начинается с каждого родителя у детей заново.
PM MAIL   Вверх
kilopmer
Дата 2.10.2012, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.10.2011

Репутация: 1
Всего: 1



а если я допустим щелкнул на колонку, то результаты в 2 и 3 столбце этой же строки, или у родителя менять хотите колонки Реферат и Рубрика? Можно при создании, разные сигналы при щелчке вешать и потом отлавливать. 
PM MAIL   Вверх
becks
Дата 2.10.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата

а если я допустим щелкнул на колонку, то результаты в 2 и 3 столбце этой же строки, или у родителя менять хотите колонки Реферат и Рубрика? Можно при создании, разные сигналы при щелчке вешать и потом отлавливать.  


хочу результаты именно в этой строке
PM MAIL   Вверх
kilopmer
Дата 2.10.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 3.10.2011

Репутация: 1
Всего: 1



если в этой же строке
Код

void TreeDialog::onTreeClicked(QModelIndex index)
{
    if(index.column()==0)
    {
        model->itemFromIndex(index.sibling(0,1))->setText("column 1");
        model->itemFromIndex(index.sibling(0,2))->setText("column 2");
    }
}

PM MAIL   Вверх
becks
Дата 2.10.2012, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



Цитата

если в этой же строке


Ой, спасибо-спасибо. Теперь работает smile. Только поправлю немножко:

Код

if(index.column()==0)
    {
        model->itemFromIndex(index.sibling(index.row(),1))->setText("column 1");
        model->itemFromIndex(index.sibling(index.row(),2))->setText("column 2");
    }

PM MAIL   Вверх
becks
Дата 2.10.2012, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 165
Регистрация: 6.7.2010

Репутация: нет
Всего: нет



А вот еще не подскажите, можно ли как-нибудь организовать так, чтобы допустим для строки "Страница" содержимое 2 колонки занимало и место детей во второй колонке. Т.е.:

user posted image

Это сообщение отредактировал(а) becks - 2.10.2012, 15:00
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1568 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.