Как отключить поведение копирования по умолчанию в QTreeView? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть 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 голосов
/ 27 сентября 2018

В качестве альтернативы, вы можете использовать installEventFilter для перехвата событий нажатия клавиш с необходимостью создания подкласса.

0 голосов
/ 19 сентября 2018

Чтобы отключить поведение копирования по умолчанию 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);
...