QTreeWigetItem - Как управлять щелчком, чтобы напрямую изменить имя текста элемента

Я создал QTreeView, который хранится в QTreeWidgetItem. Мое приложение - это своего рода файловый браузер.

ViewTree определяется следующим образом:

void MainWindow::createTreeView()
{
    TreeViewSection = new QWidget();

    QVBoxLayout *TreeViewLayout = new QVBoxLayout(TreeViewSection);

    MyTree = new TreeWidget();
    contextMenu = new QMenu(MyTree);
    MyTree->setContextMenuPolicy(Qt::ActionsContextMenu);

    addFolderAction = new QAction("Add Folder", contextMenu);
    MyTree->addAction(addFolderAction);
    connect(addFolderAction, SIGNAL(triggered()),this,SLOT(onAddFolderAction()));

    deleteAction = new QAction("Delete", contextMenu);
    MyTree->addAction(deleteAction);
    connect(deleteAction, SIGNAL(triggered()),this,SLOT(onDeleteAction()));

    MyTree->setSortingEnabled(true);
    MyTree->setColumnWidth(0, 400);

    headerItem = new QTreeWidgetItem();

    headerItem->setText(0,QString("File Name"));
    headerItem->setText(1,QString("Last Modified"));
    headerItem->setText(2,QString("Size"));
    MyTree->setHeaderItem(headerItem);

    MyTree->setAcceptDrops(true);
    MyTree->setDragEnabled(true);
    MyTree->setDragDropMode(QAbstractItemView::InternalMove);
    MyTree->setDefaultDropAction(Qt::MoveAction);
    MyTree->setDropIndicatorShown(true);
    MyTree->setDragDropOverwriteMode(true);
    MyTree->setSelectionMode(QAbstractItemView::SingleSelection);

    TreeViewLayout->addWidget(MyTree);

}

Я добавил кнопку «Добавить папку», как определено ниже для действия:

void MainWindow::onAddFolderAction()
{
    QList<QTreeWidgetItem *> item;
    uint32_t index;

    item = MyTree->selectedItems();
    if (item.empty())
        index = 0;
    else {
        QString str = item[0]->text(0);
        QByteArray latin_str = str.toLatin1();
        char *utf8_text = latin_str.data();

        index = m_device.getIdByName(utf8_text);
    }
    if(m_device.isFolder(index) == true) {
        QTreeWidgetItem* child = new QTreeWidgetItem();
        child->setText(0, "NewFolder");
        child->setText(1, "--");
        child->setText(2, "--");

        item[0]->addChild(child);
        item[0]->setExpanded(true);
      //item[0]->setSelected();

// MyTree-> редактировать (selectedItem ());

        m_device.CreateNewFolder("New Folder", index);
    } 
}

Как видите, по умолчанию я создаю «NewFolder» в системе mtp FS.

Что я хочу сделать перед созданием папки, я хотел бы иметь возможность переименовать «NewFolder» в то, что хочет пользователь. Я не хочу создавать всплывающее окно для ввода текста. Я хочу «своего рода переименование». Папка появится в древовидной структуре, новая папка будет выбрана, и текст можно будет изменить напрямую. Как и в Finder, когда вы сделали один щелчок по имени папки, она становится выбранной, и пользователь может изменить имя в поисковике без всплывающего окна.

Спасибо


person Seb    schedule 11.12.2014    source источник
comment
ИМО, это проблема модели данных. Просто установите флаг Qt::ItemIsEditable для элемента модели данных и поведения по умолчанию из QTreeView должно помочь.   -  person Marek R    schedule 11.12.2014


Ответы (1)


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

QTreeWidgetItem* child = new QTreeWidgetItem();
child->setText(0, "NewFolder");
child->setText(1, "--");
child->setText(2, "--");
child->setFlags(child->flags() | Qt::ItemIsEditable);

item[0]->addChild(child);
item[0]->setExpanded(true);

MyTree->editItem(child);
person Bowdzone    schedule 12.12.2014
comment
Спасибо, это работает. Но как после издания уловить новое значение? Я имею в виду, что он стал редактируемым, я ввожу новый ярлык и нажимаю Enter ... сразу после того, как мне нужно получить новое значение и действовать. но, используя код, я все время ловлю NewFolder, но меняю значение, когда оно становится доступным для редактирования. - person Seb; 14.12.2014