如何禁用QTreeView中的默认复制行为?

时间:2018-09-19 10:30:24

标签: c++ qt qt5 qtreeview

我有一个QTreeView和一个QStandardItemModel,并且我希望能够阻止用户复制这些项目的文本。

#include <QMainWindow>
#include <QStandardItemModel>
#include <QTreeView>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = nullptr) :
        QMainWindow(parent)
    {
        auto *treeView = new QTreeView(this);
        auto *model = new QStandardItemModel(this);

        for (int n = 0; n < 5; n++)
            model->appendRow(createItem(QString::number(n)));

        treeView->setModel(model);
        treeView->setContextMenuPolicy(Qt::NoContextMenu);

        setCentralWidget(treeView);
    }

private:
    QStandardItem *createItem(const QString &name)
    {
        auto *item = new QStandardItem(name);

        item->setFlags(Qt::ItemIsEnabled);

        return item;
    }
};

我已经使项目不可编辑并禁用了上下文菜单。但是,用户仍然可以单击某个项目并通过按Ctrl+C复制文本。我可以使用Qt::NoItemFlags,但我希望启用这些项目。

如何实现?

2 个答案:

答案 0 :(得分:1)

要在子类中禁用QTreeView重新实现QTreeView::keyPressEvent的默认复制行为,例如TreeView,像这样:

void TreeView::keyPressEvent(QKeyEvent *event)
{
    if (!(event == QKeySequence::Copy))
        QTreeView::keyPressEvent(event);
}

然后在您的代码中代替QTreeView

auto *treeView = new QTreeView(this);

实例化TreeView

auto *treeView = new TreeView(this);

答案 1 :(得分:0)

或者,您可以使用installEventFilter来捕获击键事件,而不必将其子类化。