如何以编程方式停止在Qt中编辑QTreeWidget



我有一个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,新项目被添加到当前项目下面(仍处于编辑模式(。

我想要的是当前项目存在编辑模式,并且新添加的项目成为焦点并进入编辑模式。

我试着先获取QTreeWidget中的最后一个项,然后调用closePersistentEditor(lastItem)(注释代码(,然后创建并添加新项,但没有成功。那么,如何关闭当前打开的项目编辑?

编辑:好的,我添加了额外的代码和最小的例子。要构建它,您只需要将QTreeWidgetQPushButton添加到表单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:这发生在Qt为5.12的macOS(Mojave(上。

好吧,这似乎是macOS Qt中的一个bug。我做的变通办法如下:

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

getLastTreeWidget()是我自己的方法,它返回QTreeWidget中最后添加的项。现在,每当我按下按钮添加新项目时,以前的项目将被取消选择,而新添加的项目将进入编辑模式。

最新更新