首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭自定义QItemDelegate创建的编辑器::createEditor()

如何关闭自定义QItemDelegate创建的编辑器::createEditor()
EN

Stack Overflow用户
提问于 2015-06-10 09:11:42
回答 1查看 2.7K关注 0票数 2

我创建了一个自定义项委托,它允许用户编辑文件路径列表:

我已经通过自定义类DirEdit实现了这一点。现在,选择的路径被提交,当用户按enter时编辑器被关闭,但是我想添加两种情况,在这种情况下,编辑器应该关闭,而用户不必按enter:

  1. 当用户通过激活组合框条目(单击或按返回)选择文件时
  2. 当用户通过单击“省略”工具按钮选择文件时。

我一直在使用clearFocus()和其他方法进行体验,但是似乎什么都没有用。以下是一个完整的例子:

代码语言:javascript
复制
#include <QtWidgets>

class DirEdit : public QWidget
{
    QLineEdit* lineEdit=nullptr;
public:
    DirEdit(QWidget* parent=nullptr)
        : QWidget(parent)
    {
        new QHBoxLayout(this);
        layout()->setMargin(0);
        layout()->addWidget(lineEdit=new QLineEdit(this));

        QCompleter *completer = new QCompleter(this);

        auto model = new QDirModel(completer);
        model->setFilter(QDir::AllDirs|QDir::NoDotAndDotDot);
        completer->setModel(model);

        lineEdit->setCompleter(completer);
        connect(completer, static_cast<void (QCompleter::*)(const QString&)>(&QCompleter::activated), [this](const QString& text)
            {
// >>>>>>>>>>>>>>>>>>>>>>> TODO: Make the editor close here <<<<<<<<<<<<<<<<<<<<<<<<<<<<
            });

        QToolButton* dotDotDot;
        layout()->addWidget(dotDotDot=new QToolButton(this));
        dotDotDot->setText("...");
        connect(dotDotDot, &QToolButton::clicked, this, [this]()
            {
                QString dir = QFileDialog::getExistingDirectory(window(), "Select Directory", lineEdit->text());
                if(dir!="")
                {
                    lineEdit->setText(dir);
// >>>>>>>>>>>>>>>>>>>>>>> TODO: Make the editor close here <<<<<<<<<<<<<<<<<<<<<<<<<<<<
                }
            });
        setFocusProxy(lineEdit);
    }
    void setPath(const QString& path)
    {
        lineEdit->setText(path);
    }
    QString path()const
    {
        return lineEdit->text();
    }
};

class MyDelegate : public QItemDelegate
{
    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &index) const
    {
        return new DirEdit(parent);
    }

    void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem& option, const QModelIndex &)const
    {
        editor->setGeometry(option.rect);
    }

    void setEditorData(QWidget *editor, const QModelIndex &index) const
    {
        QVariant value = index.model()->data(index, Qt::DisplayRole);

        if (DirEdit *dirEdit = dynamic_cast<DirEdit *>(editor))
            dirEdit->setPath(value.toString());
    }

    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
    {
        if (DirEdit *dirEdit = dynamic_cast<DirEdit *>(editor))
            model->setData(index, dirEdit->path());
    }
};

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    QListWidget listWidget;

    listWidget.setItemDelegate(new MyDelegate);

    listWidget.addItem(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation));
    listWidget.addItem(QStandardPaths::writableLocation(QStandardPaths::MusicLocation));
    listWidget.addItem(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
    listWidget.addItem(QStandardPaths::writableLocation(QStandardPaths::DownloadLocation));

    for (int i = 0; i<listWidget.count(); i++)
        listWidget.item(i)->setFlags(listWidget.item(0)->flags()|Qt::ItemIsEditable);

    listWidget.show();
    return app.exec();
}
EN

回答 1

Stack Overflow用户

发布于 2020-03-20 16:46:46

我用setCurrentIndex(QModelIndex())解决了一个类似的问题。

代码语言:javascript
复制
QTreeView *tree;
// ...
// ...
QObject::connect(outsideButton, &QPushButton::clicked, [tree](){
    tree->setCurrentIndex(QModelIndex());
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30752007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档