如何以编程方式停止在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中的错误。我所做的解决方法如下:

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...