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

Posted

技术标签:

【中文标题】如何以编程方式停止在 Qt 中编辑 QTreeWidget?【英文标题】:How to programmatically stop editing QTreeWidget in Qt? 【发布时间】:2021-01-20 14:10:55 【问题描述】:

我有一个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) 上。

【问题讨论】:

QTreeWidget 没有 getLastItem 方法。 @user6528273,我想getLastItem 是 OP-s 自己的方法。 @dosvarog,您能否分享有关您的代码的更多详细信息(甚至可能是演示该问题的可重现代码 sn-p)?你在视图后面使用模型吗?如果是,您是否通过模型添加新项目? @user6528273 是的,这是我自己的方法。 这发生在带有 Qt 5.12 的 macOS 上 看到 - 如果没有足够的细节,寻找解决方案就像在黑暗的房间里拍摄。无论如何,现在它是有道理的,我已经撤回了我的近距离投票。因此,它看起来要么是已解决的错误,要么是 Mac 特定问题。我正在使用 Qt 5.15.1 的 Win 10,所以我无法提供进一步的帮助。 这似乎是Qt中的一个错误,现在我发现了一些类似问题的错误报告:bugreports.qt.io/browse/QTBUG-26838。我不知道默认行为是我正在寻找的行为,所以我从来没有想过它可能是一个错误。还是谢谢! 【参考方案1】:

好的,看起来这是 Qt for macOS 中的一个错误。我所做的解决方法如下:

QTreeWidgetItem* lastItem = getLastTreeWidgetItem(widget);
if (lastItem) 
    widget->setDisabled(true);
    widget->setDisabled(false);

conversation->setFlags(conversation->flags() | Qt::ItemIsEditable);

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

【讨论】:

以上是关于如何以编程方式停止在 Qt 中编辑 QTreeWidget?的主要内容,如果未能解决你的问题,请参考以下文章

如何在诺基亚 Qt 中使用我的邮件帐户以编程方式撰写电子邮件?

如何以编程方式启动/停止 Metro Bundler

在遇到用户创建的错误后,如何以编程方式强制编译器停止编译过程?

如何在 Java 中以编程方式启动和停止 Amazon EC2 实例

如何使用 MsBuild 以编程方式在 IIS(6.0 和 7.0)中停止或启动网站?

您如何以编程方式更新 Qt 中的 UI?