Как программно остановить редактирование QTreeWidget в Qt?

#c #macos #qt #qtreewidget #qt5.12

#c #macos #qt #qtreewidget #qt5.12

Вопрос:

У меня есть QTreeWidget и две кнопки » » и «-«. Когда я нажимаю » «, я хочу добавить новый элемент в QTreeWidget, и я хочу, чтобы этот элемент находился в режиме редактирования. Мне удалось сделать это с помощью следующего кода (он вызывается каждый раз при нажатии » «):

 // QTreeWidgetItem* lastItem = getLastItem();
// if (lastItem) { widget->closePersistentEditor(lastItem); }

QTreeWidgetItem* item = new QTreeWidgetItem(widget, {"100000"});
item->setFlags(item->flags() | Qt::ItemIsEditable);
widget->addTopLevelItem(item);
widget->editItem(item);
  

Проблема в том, что я пытаюсь добавить новый элемент, но не выхожу из режима редактирования перед добавлением (нажмите Enter или что-то еще). Я получаю сообщение об ошибке edit: editing failed , и новый элемент добавляется ниже текущего элемента (который все еще находится в режиме редактирования).

Я бы хотел, чтобы текущий элемент существовал в режиме редактирования, и этот вновь добавленный элемент фокусировался и переходил в режим редактирования.

Я попытался сделать это, сначала получив последний элемент в a QTreeWidget и вызвав closePersistentEditor(lastItem) (закомментированный код), а затем создав и добавив новый элемент, но это не сработало. Итак, как закрыть текущую открытую правку по элементу?

РЕДАКТИРОВАТЬ: Хорошо, я добавил дополнительный код с минимальным примером. Единственное, что вам нужно сделать для его создания, это добавить QTreeWidget и QPushButton в форму mainwindow.ui и подключить эту кнопку к on_btnAdd_clicked() :

 #include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QTreeWidget>
#include <QTreeWidgetItem>

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

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_btnAdd_clicked()
{
    QTreeWidgetItem* item = new QTreeWidgetItem(ui->treeWidget, {"100000"});
    item->setFlags(item->flags() | Qt::ItemIsEditable);
    ui->treeWidget->addTopLevelItem(item);
    ui->treeWidget->editItem(item);
}
  

EDIT2: это происходит на macOS (Mojave) с Qt 5.12.

Комментарии:

1. QTreeWidget не имеет getLastItem метода.

2. @user6528273, я полагаю getLastItem , это собственный метод OP-s. @dosvarog, можете ли вы поделиться более подробной информацией о своем коде (возможно, даже воспроизводимым фрагментом кода, который демонстрирует проблему)? Используете ли вы модель за представлением? И если да, добавляете ли вы новый элемент через модель?

3. @user6528273 Да, это мой собственный метод.

4. это происходит на macOS с Qt 5.12 см. — без достаточных подробностей поиск решения подобен съемке в темной комнате. В любом случае, теперь это имеет смысл, и я отказался от своего закрытого голосования. Итак, похоже, что либо это была ошибка, которая уже была устранена, либо проблема, связанная с Mac. Я нахожусь на Win 10 с Qt 5.15.1, поэтому я больше не могу помочь.

5. Кажется, это ошибка в Qt, теперь я нашел сообщение об ошибке с аналогичной проблемой: bugreports.qt.io/browse/QTBUG-26838 . Я не знал, что поведение по умолчанию — это то, что я ищу, поэтому мне никогда не приходило в голову, что это может быть ошибкой. В любом случае спасибо!

Ответ №1:

Хорошо, похоже, что это ошибка в Qt для macOS. Обходной путь, который я сделал, заключается в следующем:

 QTreeWidgetItem* lastItem = getLastTreeWidgetItem(widget);
if (lastItem) {
    widget->setDisabled(true);
    widget->setDisabled(false);
}
conversation->setFlags(conversation->flags() | Qt::ItemIsEditable);
  

getLastTreeWidget() это мой собственный метод, который возвращает последний добавленный элемент в a QTreeWidget . Теперь каждый раз, когда я нажимаю кнопку, чтобы добавить новый элемент, предыдущий отменяется, а вновь добавленный переходит в режим редактирования.