#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
. Теперь каждый раз, когда я нажимаю кнопку, чтобы добавить новый элемент, предыдущий отменяется, а вновь добавленный переходит в режим редактирования.