如何以编程方式停止在 Qt 中编辑 QTreeWidget?
How to programmatically stop editing QTreeWidget in Qt?
我有一个 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)
(注释代码)然后创建和添加新项目来做到这一点,但它没有用。那么,如何关闭当前打开的项目编辑?
编辑:
好的,我用最少的例子添加了额外的代码。构建它唯一需要做的就是将 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:这发生在带有 Qt 5.12 的 macOS (Mojave) 上。
好的,看起来这是 Qt for macOS 中的一个错误。我所做的解决方法如下:
QTreeWidgetItem* lastItem = getLastTreeWidgetItem(widget);
if (lastItem) {
widget->setDisabled(true);
widget->setDisabled(false);
}
conversation->setFlags(conversation->flags() | Qt::ItemIsEditable);
getLastTreeWidget()
是我自己的方法,returns 最后添加的项目在 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)
(注释代码)然后创建和添加新项目来做到这一点,但它没有用。那么,如何关闭当前打开的项目编辑?
编辑:
好的,我用最少的例子添加了额外的代码。构建它唯一需要做的就是将 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:这发生在带有 Qt 5.12 的 macOS (Mojave) 上。
好的,看起来这是 Qt for macOS 中的一个错误。我所做的解决方法如下:
QTreeWidgetItem* lastItem = getLastTreeWidgetItem(widget);
if (lastItem) {
widget->setDisabled(true);
widget->setDisabled(false);
}
conversation->setFlags(conversation->flags() | Qt::ItemIsEditable);
getLastTreeWidget()
是我自己的方法,returns 最后添加的项目在 QTreeWidget
中。现在每次当我按下按钮添加新项目时,以前的被取消选择并且新添加的进入编辑模式。